您的位置:首页 > 理论基础 > 计算机网络

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

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

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

[cpp] view
plaincopy

/**************************************************

文件名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;

}

[cpp] view
plaincopy

/**************************************************

文件名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的服务器和客户端:

[cpp] view
plaincopy

/**************************************************

文件名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();

}

[cpp] view
plaincopy

/**************************************************

文件名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  于南昌

版权声明:本文为博主原创文章,未经博主允许不得转载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: