前面说了那么多,现在我们给出4个代码+详解,基于win32平台的socket编程。使用TCP 和 UDP 两种协议。
OK,先来看一下TCP服务器和客户端:
/************************************************** 文件名server.cpp windows下socket网络编程实例 -- 服务器端基于TCP 服务器地址:'127.0.0.1' 端口号 8888 作者:peter ***************************************************/ #include<WinSock2.h> #include<stdio.h> #pragma comment(lib,"WS2_32.lib") int main(int argc, char* argv[]) { WSADATA wsaData; WORD sockVersion = MAKEWORD(2,0);//指定版本号 ::WSAStartup(sockVersion, &wsaData);//载入winsock的dll //创建套接字基于TCP SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(s == INVALID_SOCKET) { printf("error"); ::WSACleanup();//清理,释放资源 return 0; } sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(8888);//端口号8888 sin.sin_addr.S_un.S_addr = INADDR_ANY;//地址全是0,也就是所有的地址 //绑定socket if(::bind(s, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) { printf("error"); ::WSACleanup();//清理释放资源 return 0; } //监听socket if(::listen(s, 2) == SOCKET_ERROR) { printf("error"); ::WSACleanup();//释放资源 return 0; } sockaddr_in remoteAddr; int nAddrLen = sizeof(remoteAddr); SOCKET client; char szText[] = "peter\n";//缓冲区数据 while(1) { /*accept服务器端使用,调用函数进入阻塞状态,等待用户连接,如果没有客户端进行连接,程序就在这个地方。 不会看到后面。如果有客户端连接,那么程序就执行一次然后继续循环到这里等待。*/ client = ::accept(s, (SOCKADDR*)&remoteAddr, &nAddrLen); if(client == INVALID_SOCKET) { printf("error"); continue; } printf("接受到一个连接:%s\r\n",inet_ntoa(remoteAddr.sin_addr)); ::send(client, szText, strlen(szText), 0); //发送数据 ::closesocket(client);//关闭套接字 } ::closesocket(s); ::WSACleanup(); return 0; }
/************************************************** 文件名client.cpp windows下socket网络编程实例 -- 客户端基于TCP 服务器地址:'127.0.0.1' 端口号 8888 作者:peter ***************************************************/ #include<WinSock2.h> #include<stdio.h> #pragma comment(lib, "WS2_32.lib") int main(int argc, char* argv[]) { WSADATA wsaData; WORD sockVersion = MAKEWORD(2,0);//指定版本号 ::WSAStartup(sockVersion, &wsaData);//载入winsock的dll //建立socket,基于tcp SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(s == INVALID_SOCKET) { printf("error"); ::WSACleanup(); //释放资源 return 0; } sockaddr_in servAddr; servAddr.sin_family = AF_INET; servAddr.sin_port = htons(8888);//端口号 servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//IP //连接 if(::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1) { printf("error"); ::WSACleanup(); //释放资源 return 0; } char buff[156];//缓冲区 int nRecv = ::recv(s, buff, 156, 0);//接收数据 if(nRecv > 0) { buff[nRecv] = '\0'; printf("接受数据:%s",buff); } ::closesocket(s); //关闭套接字 ::WSACleanup(); //释放资源 return 0; }
好了下面是基于UDP的服务器和客户端:
/************************************************** 文件名udpserver.cpp windows下socket网络编程实例 -- 服务器端基于UDP 服务器地址:'127.0.0.1' 端口号 8888 作者:peter ***************************************************/ #include<iostream> #include<WinSock2.h> using namespace std; #pragma comment(lib,"WS2_32.lib") void main(void) { WSADATA data; WORD w = MAKEWORD(2,0);//版本号 ::WSAStartup(w, &data);//载入winsock的dll SOCKET sock; //创建socket,基于UDP sock = ::socket(AF_INET, SOCK_DGRAM, 0); sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(8888);//端口号8888 addr.sin_addr.S_un.S_addr = INADDR_ANY;//全置为0,表示都可以 //绑定socket if(::bind(sock, (sockaddr*)&addr, sizeof(addr)) != SOCKET_ERROR) { cout << "服务器启动成功~" << endl; } else { //清理工作 ::closesocket(sock); ::WSACleanup(); return ; } char text[10] = {0}; char stext[] = "Welcome!"; sockaddr_in addrs; int n = sizeof(addrs); while(true) { //发送数据 if(::recvfrom(sock, text, 10, 0, (sockaddr*)&addrs, &n) != 0) { cout << inet_ntoa(addrs.sin_addr) << "已经连接上" << endl; cout << text << endl; //接受数据 ::sendto(sock, stext, sizeof(stext), 0, (sockaddr*)&addrs, n); break; } } ::closesocket(sock); ::WSACleanup(); }
/************************************************** 文件名udpclient.cpp windows下socket网络编程实例 -- 客户端基于UDP 服务器地址:'127.0.0.1' 端口号 8888 作者:peter ***************************************************/ #include<winsock2.h> #include<iostream> using namespace std; #pragma comment(lib,"WS2_32.lib") void main(void) { WSADATA data; WORD w = MAKEWORD(2,0);//版本号 ::WSAStartup(w, &data);//载入winsock的dll SOCKET sock; //建立socket,基于UDP sock = ::socket(AF_INET, SOCK_DGRAM, 0); sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(8888);//端口号 addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//ip地址 //绑定socket if(::bind(sock, (sockaddr*)&addr, sizeof(addr)) != SOCKET_ERROR) { cout << "客户端开启成功~" << endl; } else { //清理工作 ::closesocket(sock); ::WSACleanup(); return ; } sockaddr_in addrs; char text[10] = {0}; char stext[] = "ssss!"; int n = sizeof(addrs); //发送数据 if(::sendto(sock, stext, sizeof(stext), 0, (sockaddr*)&addr, sizeof(addr)) != 0) { //接受数据 ::recvfrom(sock, text, 10, 0, (sockaddr*)&addrs, &n); cout << "服务器说: " << text << endl; ::closesocket(sock); ::WSACleanup(); } }
代码在VS2010下编译通过;
2012/8/15
jofranks 于南昌