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