菜鸟的SOCKET编程,麻烦大家看一下,为什么不能实现基本的聊天功能

发布于 2021-11-06 12:18:01 字数 2942 浏览 694 评论 13

///////////////////////////////////////////////////////
///////////////////////////////////////////////////////

////                  服务器端                 ////////

///////////////////////////////////////////////////////
//////////////////////////////////////////////////////
#include<stdio.h>
#include <WINSOCK2.h>
#pragma comment(lib, "Ws2_32.lib")
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
 
wVersionRequested = MAKEWORD( 1, 1 );
 
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
    return;
}
 
if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) {
    WSACleanup( );
    return; 
}

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

SOCKADDR_IN addrSer;
addrSer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSer.sin_family=AF_INET;
addrSer.sin_port=htons(6000);

bind(sockSer,(SOCKADDR*)&sockSer,sizeof(SOCKADDR));

char recvBuf[100];
char tempBuf[100];
char sendBuf[100];

SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);

while(1)
{
	recvfrom(sockSer,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
	if('q'==recvBuf[0])
	{
		sendto(sockSer,"q",strlen("q")+1,0,(SOCKADDR*)&addrClient,len);
		printf("chat end!n");
		break;
	}
	sprintf(tempBuf,"%s say : %s",inet_ntoa(addrClient.sin_addr),recvBuf);
	printf("%sn",tempBuf);
	printf("please input data:n");
	gets(sendBuf);
	sendto(sockSer,sendBuf,strlen(tempBuf)+1,0,(SOCKADDR*)&addrClient,len);
}
closesocket(sockSer);
WSACleanup();
}
////////////////////////////////////////
///////////////////////////////////////

////////////     客户端   //////////

//////////////////////////////////////
//////////////////////////////////////
#include<stdio.h>
#include <WINSOCK2.h>
#pragma comment(lib, "Ws2_32.lib")
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
 
wVersionRequested = MAKEWORD( 1, 1 );
 
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
    return;
}
 
if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) {
    WSACleanup( );
    return; 
}
SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);

SOCKADDR_IN addrSev;
addrSev.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSev.sin_family=AF_INET;
addrSev.sin_port=htons(6000);

char recvBuf[100];
char sendBuf[100];
char tempBuf[100];

//SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
	printf("please input your data:n");
	gets(sendBuf);
	sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrSev,len);
	recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrSev,&len);
	if('q'==recvBuf[0])
	{
	sendto(sockClient,"q",strlen("q")+1,0,(SOCKADDR*)&addrSev,len);
	printf("chat end!n");
	break;
	}
	sprintf(tempBuf,"%s say : %s",inet_ntoa(addrSev.sin_addr),recvBuf);
	printf("%sn",tempBuf);
}
closesocket(sockClient);
WSACleanup();
}

为什么不能实现基本的聊天功能呢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(13

水水月牙 2021-11-09 20:07:48

好熟悉的代码 tag:孙鑫

策马西风 2021-11-09 20:07:48

恩,不过我不知道孙鑫是干什么啊。。

本宫微胖 2021-11-09 20:07:44

恩恩,准确的说我接触编程的时间还不长,还是个幼稚的学生。。。好的编程习惯还没养成,所以。。酿成“杯具”。我会好好的学习进步,那本书,马上就去图书馆借

卸妝后依然美 2021-11-09 20:07:40

     你应该接触网络编程不久吧. 1. UDP 和TCP都简单练习练习, TCP是优于UDP的, UDP编程需要自己写确认方案(相当于在UDP上实现个微型的TCP). 2. 网络套接字有很多模型,你需要熟练.  3. 熟练了之后,直接使用网络库, 自己去使用原始套接字 不如使用别人的开源库,boost:asio,libevent. 一个高效的网络程序需要考虑的太多.网络库能让你省去很多枯燥学习.

    推荐经典书籍 <UNIX 网络编程>(UNIX和windows都用的是套接字模型,这本书一样适合win).  It's good for you to have a look.

只为守护你 2021-11-09 20:07:07

@燕东 : 帮你找出来了. bind(sockSer,(SOCKADDR*)&sockSer,sizeof(SOCKADDR)); 的第2个参数不应该是sockeSer 而应该是地址结构,你写错了.  如果你能检查下bind的返回,或者recvfrom的返回,很快就能追寻到这行代码有问题. 所以你最好把返回值检查加上,哪步成功 哪没成功 都print出来,代码一出问题,就需要这样去做,1分钟不到,问题就能解决.

屌丝范 2021-11-09 20:06:32

恩恩,我是刚来的,不知道规矩,发现论坛上原来有这么多热心人,谢谢你,谢谢你们。我是在同一台机器上实验的,这就是书上的一个实例。recvfrom应该是一直等待信息的,可我总是实现不了,我是个菜菜菜菜鸟

奢华的一滴泪 2021-11-09 19:59:34

嘿嘿

心舞飞扬 2021-11-09 19:58:38

引用来自“JavaGG”的答案

引用来自“狼狼A狗”的答案

试试 Netty !

深巷少女 2021-11-09 16:36:07

引用来自“狼狼A狗”的答案

试试 Netty !

私藏温柔 2021-11-09 10:47:56

不会吧。。MSDN中说就是用htons

泛滥成性 2021-11-09 05:54:11

addrSev.sin_port=htons(6000);

我怎么记得是用ntohs?

南冥有猫 2021-11-09 03:55:19

试试 Netty !

毁梦 2021-11-08 14:54:41

这是数据包套接字,不需要listen的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文