标签:
学习《TCP/IP网络编程》 韩 尹圣雨 著 金国哲 译
套接字类似电话
一、服务器端套接字(listening套接字)---接电话套接字
①调用socket函数---安装电话机
#include <sys/socket.h> int socket(int domain, int type, int protocol); //成功时返回文件描述符,失败时返回-1
②调用bind函数---分配电话号码
#include <sys/socket.h> int bind(int sockfd, struct sockaddr *myaddr,socklen_t addrlen); //成功时返回0失败时返回-1
③调用listen函数---连接电话线
#include <sys/socket.h> int listen(int sockfd, int backlog); //成功时返回0,失败时返回-1
④调用accept函数---拿起话筒
#include <sys/socket.h> int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); //成功时返回文件描述符,失败时返回-1
第一步:调用socket函数创建套接字
第二步:调用bind函数分配IP和端口号
第三步:调用listen函数转为可接收请求状态
第四步:调用accept函数受理连接请求
二、客户端套接字---打电话套接字
①调用socket函数创建套接字
②调用connect函数向服务器端发送连接请求
#include <sys/socket.h> int connect(int sockfd, struct sockaddr *serv_addr, socklen_t addrlen); //成功时返回0,失败时返回-1
windows服务器端程序示例
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <winsock2.h> 4 5 void ErrorHanding(char* message); 6 7 int main(int argc,char* argv[]) 8 { 9 WSADATA wsaData; 10 SOCKET hServSock, hClntSock; 11 SOCKADDR_IN servAddr, clntAddr; 12 int szClntAddr; 13 char message[] = "Hello World!"; 14 if (argc!=2) 15 { 16 printf("Usage : %s <port> \n",argv[0]); 17 exit(1); 18 } 19 //初始化套接字库 20 if (WSAStartup(MAKEWORD(2,2),&wsaData)!=0) 21 { 22 ErrorHanding("WSAStarup() error!"); 23 } 24 //创建套接字 25 hServSock = socket(PF_INET, SOCK_STREAM, 0); 26 if (hServSock == INVALID_SOCKET) 27 { 28 ErrorHanding("socket() error!"); 29 } 30 31 memset(&servAddr, 0, sizeof(servAddr)); 32 servAddr.sin_family = AF_INET; 33 servAddr.sin_addr.s_addr = htonl(INADDR_ANY); 34 servAddr.sin_port = htons(atoi(argv[1])); 35 //给该套接字分配IP地址和端口号 36 if (bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR) 37 { 38 ErrorHanding("bind() error"); 39 } 40 //调用listen函数使创建的套接字成为服务器端套接字 41 if(listen(hServSock, 5) == SOCKET_ERROR) 42 { 43 ErrorHanding("listen() error"); 44 } 45 //调用accept函数受理客户端的连接请求 46 szClntAddr = sizeof(clntAddr); 47 hClntSock = accept(hServSock,(SOCKADDR*)&clntAddr,&szClntAddr); 48 if (hClntSock == INVALID_SOCKET) 49 { 50 ErrorHanding("accept() error"); 51 } 52 //调用send函数向连接的客户端传输数据 53 send(hClntSock, message, sizeof(message), 0); 54 closesocket(hClntSock); 55 closesocket(hServSock); 56 //程序终止前注销创建的套接字库 57 WSACleanup(); 58 return 0; 59 } 60 void ErrorHanding(char* message) 61 { 62 fputs(message, stderr); 63 fputc(‘\n‘,stderr); 64 exit(1); 65 }
windows客户端程序示例
1 #include <stdio.h> 2 #include <cstdlib> 3 #include <winsock2.h> 4 5 void ErrorHanding(char* message); 6 7 int main(int argc, char* argv[]) 8 { 9 WSADATA wsaData; 10 SOCKET hSocket; 11 SOCKADDR_IN servAddr; 12 13 char message[100]; 14 int strLen; 15 if (argc != 3) 16 { 17 printf("Usage : %s <IP> <PORT>\n",argv[0]); 18 exit(1); 19 } 20 //初始化Winsock库 21 if (WSAStartup(MAKEWORD(2,2), &wsaData) !=0) 22 { 23 ErrorHanding("WSAStartup() error!"); 24 } 25 //创建套接字 26 hSocket = socket(PF_INET,SOCK_STREAM, 0); 27 if (hSocket == INVALID_SOCKET) 28 { 29 ErrorHanding("socket() error"); 30 } 31 32 memset(&servAddr, 0, sizeof(servAddr)); 33 servAddr.sin_family = AF_INET; 34 servAddr.sin_addr.s_addr = inet_addr(argv[1]); 35 servAddr.sin_port = htons(atoi(argv[2])); 36 //通过此套接字向服务器端发出连接请求 37 if (connect(hSocket,(SOCKADDR*)&servAddr, sizeof(servAddr))== SOCKET_ERROR) 38 { 39 ErrorHanding("connect() error"); 40 } 41 //调用recv函数接收服务器发来的数据 42 strLen = recv(hSocket, message, sizeof(message)-1, 0); 43 if (strLen == -1) 44 { 45 ErrorHanding("recv() ERROR"); 46 } 47 printf("Message from server : %s \n",message); 48 49 closesocket(hSocket); 50 //注销winsock库 51 WSACleanup(); 52 return 0; 53 54 55 } 56 57 void ErrorHanding(char* message) 58 { 59 fputs(message, stderr); 60 fputc(‘\n‘,stderr); 61 exit(1); 62 }
标签:
原文地址:http://www.cnblogs.com/yedekuan/p/4348288.html