winsock实现基于TCP的客户端/服务器通讯

一、服务器端程序代码

#include <stdio.h>
#include <stdlib.h>


#pragma comment(lib, "ws2_32.lib") //或者在项目属性的连接器的输入的附加依赖项中添加ws2_32.lib


#define  PORT 5000


void main()
{
int port=PORT;
WSADATA wsaData;
SOCKET sListen,sAccept;


int iLen; //客户地址长度
int iSend; //发送数据长度
char buf[]="hello,how are you";//需要发送的信息
struct sockaddr_in serv,client;//服务器、客户的地址
if (WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
printf("Winsock load failed\n");
return;
}


sListen=socket(AF_INET,SOCK_STREAM,0);//创建套接字
if (sListen==INVALID_SOCKET)
{
//创建套接字失败
printf("socket failed:%d\n",WSAGetLastError());//输出错误
return;
}


//建立服务器地址
serv.sin_family=AF_INET;
serv.sin_port=htons(port);//把一个双字节主机字节顺序的数据转换为网络字节顺序
serv.sin_addr.s_addr=htonl(INADDR_ANY);//把四字节主机字节顺序转换为网络字节顺序,INADDR_ANY为系统指定的IP地址


//绑定
if (bind(sListen,(LPSOCKADDR)&serv,sizeof(serv))==SOCKET_ERROR)
{
//绑定失败
printf("bind() failed:%d\n",WSAGetLastError());
return;
}


//进入监听状态
if (listen(sListen,5)==SOCKET_ERROR)//正在等待连接的最大个数是5
{
//侦听出错
printf("listen() failed:%d\n",WSAGetLastError());
return;
}


iLen=sizeof(client);//初始化客户地址长度


//进入循环等待客户端连接请求
while(1)
{
sAccept=accept(sListen,(struct sockaddr*)&client,&iLen);
if (sAccept==INVALID_SOCKET)
{
printf("accept() failed:%d\n",WSAGetLastError());
break;
}
printf("accepted client IP:[%s],port:[%d]\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));


//给客户端发送数据
iSend=send(sAccept,buf,sizeof(buf),0);
if (iSend==SOCKET_ERROR)
{
printf("send() failed:%d\n",WSAGetLastError());
break;
}
else if (iSend==0)
{
break;

else
{
printf("send() byte:%d\n",iSend);
}


closesocket(sAccept);
}


closesocket(sListen);
WSACleanup();
}


二、客户端代码

#pragma  comment(lib,"ws2_32.lib")


#include <WinSock2.h>
#include <stdio.h>


#define  PORT 5000
#define  BUFFER 1024


void main(int argc, char* argv[])
{
WSADATA wsaData;
SOCKET client;
int port=PORT;


int iLen; //从服务器接收的数据长度
char buf[BUFFER];


struct sockaddr_in serv;//服务器端地址
memset(buf,0,sizeof(buf));//接收缓冲区初始化
if (WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
printf("winsock load failed\n");
return;
}


//需要连接的服务器地址信息
serv.sin_family=AF_INET;//需要连接的服务器的地址信息
serv.sin_addr.s_addr=inet_addr(argv[1]);//将命令行的IP地址转换为二进制表示的网络字节顺序IP地址
serv.sin_port=htons(port);


client=socket(AF_INET,SOCK_STREAM,0);//建立客户端流套接字


if (client==INVALID_SOCKET)
{
printf("socket() failed:%d\n",WSAGetLastError());
return;
}


//请求与服务器建立TCP连接
if (connect(client,(struct sockaddr*)&serv,sizeof(serv))==INVALID_SOCKET)
{
printf("connect() failed:%d\n",WSAGetLastError());
return;
}
else
{
iLen=recv(client,buf,sizeof(buf),0);
if (iLen==0)
{
return;
}
else if (iLen==SOCKET_ERROR)
{
printf("recv() failed:%s\n",WSAGetLastError());
return;
}
printf("recv() data from server:%s\n",buf);
}


closesocket(client);
WSACleanup();
printf("press any key to continue");
while(1);
}

注:服务器端程序可以直接运行,但是客户端程序需要通过命令行启动,在命令中输入IP地址即可


代码下载地址 http://download.csdn.net/detail/jjp837661103/5694505

在我的资源中还提供了基于MFC的简单通讯的实现。下载

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

踏雪_无痕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值