首先我们先来了解一下TCP和UDP的工作流程:
TCP:
TCP的工作流程图
UDP:
UDP的工作流程图
我们用TCP来做一个例子实现服务器和客户端数据的交换。
server端:
#include "stdafx.h" #include <WinSock2.h> #include <stdio.h> #pragma comment(lib,"ws2_32.lib") int _tmain(int argc, _TCHAR* argv[]) { //以下几句都是固定的 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(1, 1); //加载一个Winsocket库版本 err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) { return 0; } if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) { WSACleanup(); return 0; } //socket编程部分 SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);//面向连接的可靠性服务SOCK_STREAM SOCKADDR_IN addrSrv;//存放本地地址信息 addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//htol将主机字节序long型转换为网络字节序 addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(9000);//htos用来将端口转换成字符,1024以上的数字即可 bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//将socket绑定到相应地址和端口上 listen(sockSrv, 5);//等待队列中的最大长度为5 SOCKADDR_IN addrClient; int len = sizeof(SOCKADDR); while (1) { SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);//建立一个新的套接字用于通信,不是前面的监听套接字 char sendBuf[100]; sprintf(sendBuf, "Server IP is %s", inet_ntoa(addrClient.sin_addr));//inet_nota函数是将字符转换成ip地址 send(sockConn, sendBuf, strlen(sendBuf) + 1, 0);//服务器向客户端发送数据 char recvBuf[100]; recv(sockConn, recvBuf, 100, 0);//服务器从客户端接受数据 printf("%s\n", recvBuf); closesocket(sockConn);//关闭socket } return 0; }
client端:
#include "stdafx.h" #include <Winsock2.h> #include <stdio.h> #pragma comment(lib,"ws2_32.lib") int _tmain(int argc, _TCHAR* argv[]) { //固定格式 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(1, 1); err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) { return 0; } if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) { WSACleanup(); return 0; } //建立通讯socket SOCKET socketClient = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr = inet_addr("10.146.138.92");//设定需要连接的服务器的ip地址 addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(9000);//设定需要连接的服务器的端口地址 connect(socketClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//与服务器进行连接 //接受服务器消息 char recvBuf[100]; recv(socketClient, recvBuf, 100, 0); printf("来自服务器的消息:\n%s\n", recvBuf); //发送信心给服务器 send(socketClient, "你好,我是客户端FreeBamb,IP地址:10.146.138.92", strlen("你好,我是客户端FreeBamb,IP地址:10.146.138.92") + 1, 0); closesocket(socketClient); WSACleanup(); return 0; }
运行结果:
client:
server:
csdn下载地址:http://download.csdn.net/detail/davebobo/9489092