前面说了那么多,现在我们给出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 于南昌
版权声明:本文为博主原创文章,未经博主允许不得转载。