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

燕东 发布于 2011/10/08 18:33
阅读 654
收藏 0
///////////////////////////////////////////////////////
///////////////////////////////////////////////////////

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

///////////////////////////////////////////////////////
//////////////////////////////////////////////////////
#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("%s\n",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("%s\n",tempBuf);
}
closesocket(sockClient);
WSACleanup();
}

为什么不能实现基本的聊天功能呢
加载中
0
asdfsx
asdfsx
服务器端不需要listen???bind之后直接就可以用了???
燕东
燕东
这是数据包套接字,不需要listen的
0
狼狼A狗
狼狼A狗
试试 Netty !
0
TrulyBelieve
TrulyBelieve

addrSev.sin_port=htons(6000);

我怎么记得是用ntohs?

燕东
燕东
不会吧。。MSDN中说就是用htons
0
JavaGG
JavaGG

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

试试 Netty !
他不是java....
0
狼狼A狗
狼狼A狗

引用来自“JavaGG”的答案

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

试试 Netty !
他不是java....
Sorry,最近在搞Netty,满脑子这个东西!
燕东
燕东
嘿嘿
0
Lunar_Lin
Lunar_Lin

      为什么2个端口号全是 6000  .  你肯定是在一个机器上试的吧.你代码加点log, 或者加断点调试下,另外有什么情况最好直接说出来.大家不是都有精力复制代码去运行的. 毕竟即不送钱也不送美女...

       recvfrom返回值 最好检查检查.... 处理下recvfrom出错.   任重而道远, 别急着你的聊天功能了. 先理解UDP编程,看懂书上的例子吧.

燕东
燕东
恩恩,我是刚来的,不知道规矩,发现论坛上原来有这么多热心人,谢谢你,谢谢你们。我是在同一台机器上实验的,这就是书上的一个实例。recvfrom应该是一直等待信息的,可我总是实现不了,我是个菜菜菜菜鸟
0
Lunar_Lin
Lunar_Lin
@燕东 : 帮你找出来了. bind(sockSer,(SOCKADDR*)&sockSer,sizeof(SOCKADDR)); 的第2个参数不应该是sockeSer 而应该是地址结构,你写错了.  如果你能检查下bind的返回,或者recvfrom的返回,很快就能追寻到这行代码有问题. 所以你最好把返回值检查加上,哪步成功 哪没成功 都print出来,代码一出问题,就需要这样去做,1分钟不到,问题就能解决.
0
Lunar_Lin
Lunar_Lin

     你应该接触网络编程不久吧. 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.

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

好熟悉的代码 tag:孙鑫

燕东
燕东
恩,不过我不知道孙鑫是干什么啊。。
返回顶部
顶部