c语言socket实现主机与客户端异步通信.doc
- 文档编号:1215086
- 上传时间:2023-04-30
- 格式:DOC
- 页数:6
- 大小:23.50KB
c语言socket实现主机与客户端异步通信.doc
《c语言socket实现主机与客户端异步通信.doc》由会员分享,可在线阅读,更多相关《c语言socket实现主机与客户端异步通信.doc(6页珍藏版)》请在冰点文库上搜索。
服务器端代码编写
#include
#include
/***定义端口**/
#definePORT8888
/***定义最大传输数据量**/
#defineMAXDATA100
/****在入口函数中输入主机IP地址****/
intmain(intargc,char**argv)
{
/*定义标志,接收到第一个client时,不在接收其他client*/
intflag=1;
/*得到socket嵌套字*/
SOCKETserver;
/*定义发送消息的长度*/
intsdMsgLen;
/*启动windows的socket服务*/
WSADATAwsaData;
WSAStartup(0x101,&wsaData);
char*CloseClient="bye";
char*CloseC_S="byebye";
/*定义receive数据长度*/
intreceive;
intlen;
/*创建服务器*/
structsockaddr_inserveraddr;
/*创建客户端*/
structsockaddr_inaddrClient;
/*将serveraddr置零*/
memset((void*)&serveraddr,0,sizeof(serveraddr));
/*定义家族协议*/
serveraddr.sin_family=AF_INET;
/*定义主机地址*/
serveraddr.sin_addr.s_addr=inet_addr(argv[1]);//);"192.168.1.100"
/*定义主机端口*/
serveraddr.sin_port=htons(PORT);
/*得到socket嵌套字*/
server=socket(AF_INET,SOCK_STREAM,0);
/*返回值为-1,未启动windows的socket服务*/
if(server==-1)
{
perror("socketerror!
");
}
/*绑定成功返回0*/
if(bind(server,(structsockaddr*)&serveraddr,sizeof(serveraddr))==-1)
{
perror("不能进行绑定!
");
exit
(1);
}
/*定义客户端嵌套字*/
SOCKETclient;
/*进入监听客户端连接和监听客户端发送的消息*/
while
(1)
{
/*定义并初始化接收数据的存储*/
charreceiveBuffer[MAXDATA]="\n";
/*定义并初始化发送数据存储*/
charsendBuffer[MAXDATA]="\n";
/*采用异步发送消息*/
boolsendFlag=false;
/*监听客户端*/
if(listen(server,20)==-1)
{
perror("不能进行监听!
");
exit
(1);
}
/*接收到第一个用户后将其锁定,不在接收其他用户*/
if(flag)
{
len=sizeof(structsockaddr_in);
/*得到客户端的嵌套字*/
client=accept(server,(SOCKADDR*)&addrClient,&len);
if(client==-1)
{
perror("accepterror");
continue;
}
printf("新连接:
%s\n",inet_ntoa(addrClient.sin_addr));
/*创建一个消息*/
char*msg="Hello,ConnectedSuccessfully!
\n";
intlen=strlen(msg);
/*得到send的返回值,返回为发送消息的长度.若发送失败则返回-1*/
intsendLen=send(client,msg,len,0);
if(sendLen==-1)
{
perror("消息发送失败!
\n");
closesocket(client);
}
msg=0;
/*接收到第一个客户端,将其锁定*/
flag=0;
}
/*得到接收到消息的长度*/
receive=recv(client,receiveBuffer,MAXDATA,0);
/*若消息长度为-1,则接收数据失败*/
if(receive==-1)
{
perror("接收出错!
\n");
/*关闭客户端*/
closesocket(client);
}
printf("%s\n",receiveBuffer);
/*测试客户端发送的结束通话标志*/
if(strcmp(receiveBuffer,CloseClient)==0)
{
printf("失去客户端:
%s\n",inet_ntoa(addrClient.sin_addr));
flag=1;
closesocket(client);
}
elseif(strcmp(receiveBuffer,CloseC_S)==0)
{
closesocket(server);
exit
(1);
}
else
{
printf("Client%ssendmessage:
%s\n",inet_ntoa(addrClient.sin_addr),receiveBuffer);
/*当接收到消息后,服务器才可以发送消息*/
sendFlag=true;
}
while(sendFlag)
{
printf("YourMessage:
");
/*得到服务器输入的字符串*/
scanf("%s",sendBuffer);
sdMsgLen=strlen(sendBuffer);
/*得到服务器发送消息的长度*/
intsendLen=send(client,sendBuffer,sdMsgLen,0);
if(sendLen==-1)
{
perror("消息发送失败!
");
closesocket(client);
}
/*结束服务器发送消息模式,改为接收模式*/
sendFlag=false;
}
}
return0;
}
客户端代码编写
#include
#include
#include
/*定义与主机连接的端口*/
#definePORT8888
/*定义最大传输数据量*/
#defineMAXDATA100
/*由入口函数得到需要连接主机的IP地址*/
intmain(intars,char**arg)
{
/*开启windows的socket*/
WSADATAwsaData;
WSAStartup(0x101,&wsaData);
/*定义服务器*/
structsockaddr_inserveraddr;
/*将serveraddr清零*/
memset((void*)&serveraddr,0,sizeof(serveraddr));
/*定义家族协议*/
serveraddr.sin_family=AF_INET;
/*得到主机IP地址*/
serveraddr.sin_addr.s_addr=inet_addr(arg[1]);//);//)"192.168.1.100";
/*得到端口*/
serveraddr.sin_port=htons(PORT);
/*得到socket嵌套字*/
SOCKETs=socket(AF_INET,SOCK_STREAM,0);
/*
*建立TCP连接
*参数1:
socket返回的描述符
*参数2:
主机IP地址和端口号指针
*参数3:
远端地质借口长度
*/
if(connect(s,(structsockaddr*)&serveraddr,sizeof(serveraddr))==-1)
{
perror("连接错误!
");
exit
(1);
}
/*进入监听服务器发送消息,采取异步通信*/
while
(1)
{
/*初始化接收和发送数据的存储*/
charreceiveBuffer[MAXDATA]="\n";
charsendBuffer[MAXDATA]="\n";
/*定发送模式*/
boolsendFlag=false;
/*如果接收数据位-1则接收错误,正确是recv返回接收到数据的长度*/
if(recv(s,receiveBuffer,MAXDATA,0)==-1)
{
perror("接收数据错误!
");
exit
(1);
}
printf("server%ssendmessage:
%s\n",inet_ntoa(serveraddr.sin_addr),receiveBuffer);
/*发送模式*/
sendFlag=true;
while(sendFlag)
{
char*CloseClient="bye";
char*CloseC_S="byebye";
/*得到输入的数据*/
printf("YourMessage:
");
scanf("%s",sendBuffer);
if(strcmp(sendBuffer,CloseClient)==0)
{
send(s,CloseClient,strlen(CloseClient),0);
closesocket(s);
exit
(1);
}
else{
/*得到发送数据的长度*/
intsendLen=send(s,sendBuffer,strlen(sendBuffer),0);
/*发送数据长度为-1时,发送失败*/
if(sendLen==-1)
{
perror("发送错误!
");
closesocket(s);
}
}
/*发送模式结束,进入接收模式*/
sendFlag=false;
}
}
return0;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 socket 实现 主机 客户端 异步 通信
![提示](https://static.bingdoc.com/images/bang_tan.gif)