前面说了那么多,现在我们给出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 于南昌