最近由于本人对网络编程的喜爱,所以对一点关于TCP协议socket编程的总结。由于本人的能力有限,写的可能过于简单,只适合初学者,欢迎大牛提出宝贵的意见,本人会感激不尽的。废话少说了,进入正题。(下面代码是基于VC6.0)
下图是一般socket 编程图。
服务器的建立:
获取的本机名,用来解析得到本机的IP地址的;接着就绑定IP地址成功,然后服务器就处于监听状态,等待客户端的连接。也就是接下来就是TCP/IP的三次握手的操作,该操作成功了服务器和客户端就可以进行通信了。以下是注释代码:
void socketConnect() { char Server_name[128]; WSADATA wsaData; struct hostent *hp; struct sockaddr_in addrServer; WSAStartup(0x202, &wsaData); sockfd = socket(AF_INET, SOCK_STREAM, 0); //socket gethostname(Server_name, 128); hp = gethostbyname(Server_name); //获取本机名 printf("本机名 : %sn", Server_name); memset(&addrServer, 0, sizeof(addrServer)); //初始化 memcpy(&(addrServer.sin_addr), hp->h_addr, hp->h_length); //设置服务器的IP地址 addrServer.sin_family = AF_INET; //设置版本 addrServer.sin_port = htons((unsigned short)SERVER_PORT); //设置端口号 //bind....绑定ip地址和端口号 if(SOCKET_ERROR == bind(sockfd, (LPSOCKADDR)&addrServer, sizeof(addrServer))) { printf("Bind socket error!n"); //exit(1); } else { printf("绑定 socket success...n"); } listen(sockfd, 5); //listening...监听 printf("服务器监听状态...n"); ZeroMemory((void *)&addrtemp, sizeof(addrtemp)); nlen = sizeof(addrtemp); connfd = accept(sockfd, &addrtemp, &nlen); //accept...三次握手 printf("accept client success...nn"); }
客户端的建立:
其实客户端和服务器代码都差不多的,只是最后面的一个connect()函数,就是发送一个请求链接给服务器,因为服务器在accept()函数时阻塞等待客户端的链接,然后经过三次握手,成功之后,服务器和客户端就可以进行通信了。
WSAStartup(0x202, &wsaData); if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) //socket... { printf("socket error!n"); exit(1); } gethostname(Server_name, 128); host = gethostbyname(Server_name); //获取本机名 printf("本机名 : %sn", Server_name); memset(&addrServer, 0, sizeof(addrServer)); //初始化 memcpy(&(addrServer.sin_addr), host->h_addr, host->h_length); //设置ip addrServer.sin_family = AF_INET; //设置版本号 addrServer.sin_port = htons((unsigned short)SERVER_PORT); //设置端口号 //connect....向服务器发起链接 if(connect(sockfd, (struct sockaddr *)&addrServer, sizeof(struct sockaddr))) { printf("connect error!n"); exit(1); } printf("连接服务器成功connec success...nn");
接下来是send()和recv()函数:
//send...发送消息
scanf("%s", sendBuf);
getchar();
if( (sendbytes = send(connfd, sendBuf, strlen(sendBuf), 0)) <= 0)
{
printf("send error !n");
continue;
}
memset(sendBuf, 0, sizeof(sendBuf));
//recv...接收消息
memset(recvBuf, 0, sizeof(recvBuf));
if( (recvbytes = recv(connfd, recvBuf, sizeof(recvBuf), 0)) <= 0)
{
printf("recv error!n");
exit(1);
}
printf("recvbytes = %dn", recvbytes);
printf("recv from client : %sn", recvBuf);
不足之处欢迎指出,共同学习!!