socket programming

进行 socket programming开始要做的工作:

 

On Linux:

 

以下是client代码,使用TCP,注意网络字节序:

 1 #include <sys/socket.h>  
 2 #include <netinet/in.h>  
 3 #include <arpa/inet.h>  
 4 int main()  
 5 {  
 6     int sockfd;  
 7     int len;  
 8     struct sockaddr_in address;  
 9     int result;  
10     struct img_packet img_pkt;  
11     int offset = 0;  
12     sockfd = socket(AF_INET, SOCK_STREAM, 0);  
13     address.sin_family = AF_INET;  
14     address.sin_addr.s_addr = inet_addr("192.168.1.157");   
15     address.sin_port = htons(8080);  
16     len = sizeof(address);  
17     result = connect(sockfd, (struct sockaddr *)&address, len);  
18     if(result < 0)  
19         return -1;  
20     else  
21     {  
22         // send or receive operations  
23     }  
24     return 0;  
25 }  

 

服务器端程序创建socket的方法是一样的,只是要最后要调用bind()、listen()和accept(),示例代码如下:

 

 1 #include <sys/socket.h>  
 2 #include <netinet/in.h>  
 3 #include <arpa/inet.h>  
 4 int main(int argc, char **argv)  
 5 {  
 6     int server_sockfd, client_sockfd;  
 7     size_t server_len, client_len;  
 8     struct sockaddr_in server_address;  
 9     struct sockaddr_in client_address;  
10     int nPort = 8080;  
11     int keepAlive = 1;  
12     server_sockfd = socket(AF_INET, SOCK_STREAM, 0);  
13     server_address.sin_family = AF_INET;  
14     server_address.sin_addr.s_addr = inet_addr("192.168.1.101");  
15     printf("%s:%d/n", inet_ntoa(server_address.sin_addr), nPort);  
16     server_address.sin_port = htons(nPort);  
17     server_len = sizeof(server_address);  
18     bind(server_sockfd, (struct sockaddr *)&server_address, server_len);  
19     listen(server_sockfd, 5);  
20     client_len = sizeof(client_address);  
21     while (1)  
22     {  
23         client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);  
24         // do something  
25           
26         close(client_sockfd);  
27     }  
28     close(server_sockfd);  
29     return 0;  
30 } 

 

使用UDP:

 1 #include <sys/socket.h>  
 2 #include <netinet/in.h>  
 3 #include <arpa/inet.h>  
 4     int sockfd;  
 5     socklen_t len;  
 6     struct sockaddr_in address;  
 7     sockfd = socket(AF_INET, SOCK_DGRAM, 0);  
 8     address.sin_family = AF_INET;  
 9     address.sin_addr.s_addr = INADDR_ANY;     //inet_addr("192.168.1.105");  
10     address.sin_port = htons(9000);  
11     len = sizeof(address);  
12     bind(sockfd, (struct sockaddr *)&address, len);  
13     // do something here 

若要发送数据给其他计算机,其中address.sin_addr.s_addr的值应为对方计算机的IP地址;若是接收数据,则该值在recvfrom()函数中会被赋为对方计算机的IP地址值。bind()函数只有在要监听某个端口的UDP数据时才使用。这时address.sin_addr.s_addr值可设为INADDR_ANY。

 

On Windows:

 

使用TCP连接:

 1 #include <winsock2.h>  
 2     WSADATA wsaData;  
 3     int iResult;  
 4     iResult = WSAStartup(MAKEWORD(2,2), &wsaData);  
 5     if (iResult != 0)  
 6     {  
 7         cout<<"WSAStartup failed: "<<iResult<<endl;  
 8     return -1;  
 9     }  
10     struct sockaddr_in sa;  
11     sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  
12     sa.sin_family = AF_INET;  
13     sa.sin_addr.s_addr = inet_addr("192.168.1.166");  
14     sa.sin_port = htons(9000);  
15     int len = sizeof(sa);  
16     iResult = connect(sock, (struct sockaddr *)&sa, len);  
17     if (iResult == SOCKET_ERROR)  
18     {  
19         cout<<"not connected"<<endl;  
20     return -1;  
21     }  
22     // do something here  

UDP:

 1 #include <winsock2.h>  
 2    WSADATA wsaData;  
 3    int iResult;  
 4    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);  
 5    if (iResult != 0)  
 6    {  
 7 //cout<<"WSAStartup failed: "<<iResult<<endl;  
 8 DbgLog((LOG_TRACE, 0, TEXT("WSAStartup failed:  %d"), iResult));  
 9 return -1;  
10    }  
11    struct sockaddr_in sa, from;  
12    SOCKET sock;  
13    sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);  
14    sa.sin_family = AF_INET;  
15    sa.sin_addr.s_addr = INADDR_ANY;  
16    sa.sin_port = htons(port);  
17    int len = sizeof(sa);  
18    bind(sock, (struct sockaddr *)&sa, len);  
19    // do something here  

 

posted on 2017-12-15 16:58  Milo_lu  阅读(413)  评论(0编辑  收藏  举报

导航