永发信息网

关于VC++ socket如何实现聊天全双工

答案:1  悬赏:0  手机版
解决时间 2021-04-21 12:03

关于VC++ socket如何实现聊天全双工,下面这个程序实现了单工,那位大虾给改成全双工的,(实现两方可以完全任意的发送消息,而不用你一句,对方一句那样发)多谢,急急急!!!

1、UDPchatcli端

#include <winsock2.h>

#include <stdio.h>

void main()

{

WSADATA wsaData;

WSAStartup(WINSOCK_VERSION,&wsaData);

SOCKET client = socket(AF_INET,SOCK_DGRAM,0);

struct sockaddr_in svraddr;

memset(&svraddr,0,sizeof(svraddr));

svraddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

svraddr.sin_family = AF_INET;

svraddr.sin_port = htons(9999);

char sendbuf[100];

char recvbuf[100];

int len = sizeof(sockaddr);

while(1)

{

gets(sendbuf);

sendto(client,sendbuf,sizeof(sendbuf)+1,0,(struct sockaddr *)&svraddr,len);

if ('q'==sendbuf[0])

{

printf("Chat end!");

break;

}

recvfrom(client,recvbuf,sizeof(recvbuf),0,(struct sockaddr *)&svraddr,&len);

printf("%s\n",recvbuf);

if ('q'==recvbuf[0])

{

printf("Chat end!");

break;

}

}

closesocket(client);

WSACleanup();

}

2、UDPchatserver端

#include <winsock2.h>

#include <stdio.h>

void main()

{

WSADATA wsaData;

WSAStartup(WINSOCK_VERSION,&wsaData);

SOCKET svr=socket(AF_INET,SOCK_DGRAM,0);

struct sockaddr_in svraddr,clientaddr;

memset(&svraddr,0,sizeof(svraddr));

svraddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

svraddr.sin_family = AF_INET;

svraddr.sin_port = htons(9999);

bind(svr,(struct sockaddr *)&svraddr,sizeof(svraddr));

char recvbuf[100];

char sendbuf[100];

int len = sizeof(sockaddr);

printf("This is server.");

while(1)

{

recvfrom(svr,recvbuf,sizeof(recvbuf),0,(struct sockaddr *)&clientaddr,&len);

printf("%s say %s\n",inet_ntoa(clientaddr.sin_addr),recvbuf);

if ('q'==recvbuf[0])

{

printf("Chat end!");

break;

}

printf("Please input data:\n");

gets(sendbuf);

sendto(svr,sendbuf,sizeof(sendbuf)+1,0,(struct sockaddr *)&clientaddr,len);

if ('q'==sendbuf[0])

{

printf("Chat end!");

break;

}

}

closesocket(svr);

WSACleanup();

}

最佳答案
你这个程序采用udp发送/接收数据,并且使用了阻塞方式的Socket,这样在读数据时会一直等到读到数据后才能执行后面的步骤,写数据时也会等到将全部数据写完才执行后面的步骤。修改这个程序首先要将创建的Socket改成异步读写的形式,然后使用select函数判断socket是否有数据可读和可以发送数据,并且udp发送的数据包不能过大,一包数据以不超过1392字节为宜。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
离线经验可否积累
陕西绿元房地产开发有限公司我想知道这个在什
美女不坏大结局
QQ三国改出的四象剑+纳术的为什么没有人要?
dnf乖乖怎么定不了位啊
从常乐小区到四川现代职业学院怎么走?
离别赠言同事,对一个即将要离开的同事,可以
辽宁省消协怎么去啊,有知道地址的么
杭州进口食品批发
QQ飞车 里的酷币怎么用
如何查看手机运行内存,手机运行内存突然增加
初中数学题哈
QQ音速怎麼才能把那個防沉迷弄沒
煤油打火机棉芯怎么换,zippo打火机怎么加气
六一超市地址有知道的么?有点事想过去
推荐资讯
有火、冰、光、暗属性攻击有啥好处
龙骑士online是不是免费网游?
1818便当龙港店在什么地方啊,我要过去处理事
描写加班到很晚的句子,写人疲惫的句子
富兴花园在哪里啊,我有事要去这个地方
如果用一首歌来表达你的09年、你会用哪一首?
硬盘无法格式化
谁给个困兽之斗的MP3地址?做空间用的 、
好友买卖怎么长身价啊?
拔完牙后发烧是怎么回事啊?怎么办?
如何检查N78水货真伪,有详细步骤的
这个传承西南二能卖多少啊
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?