【网络编程】之四、socket网络编程例解

来源:互联网 发布:php调用短信接口代码 编辑:程序博客网 时间:2024/05/22 02:28

前面说了那么多,现在我们给出4个代码+详解,基于win32平台的socket编程。使用TCP  和  UDP  两种协议。


OK,先来看一下TCP服务器和客户端:

/**************************************************文件名server.cppwindows下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//创建套接字基于TCPSOCKET 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);//端口号8888sin.sin_addr.S_un.S_addr = INADDR_ANY;//地址全是0,也就是所有的地址//绑定socketif(::bind(s, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR){printf("error");::WSACleanup();//清理释放资源return 0;}//监听socketif(::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.cppwindows下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,基于tcpSOCKET 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.cppwindows下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的dllSOCKET sock;//创建socket,基于UDPsock = ::socket(AF_INET, SOCK_DGRAM, 0);sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(8888);//端口号8888addr.sin_addr.S_un.S_addr = INADDR_ANY;//全置为0,表示都可以//绑定socketif(::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.cppwindows下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的dllSOCKET sock;//建立socket,基于UDPsock = ::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地址//绑定socketif(::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  于南昌