WinSocket的客户端和服务端无法连接,请指点,附程序!!!

lucksunok 2007-04-28 10:17:34
各位高手,我有以下VC中的UDP,Socket代码,运行后两者不能通信,收不到信息,
不知道是什么原因,请高手指点!!!!

//主机服务器端代码:-------------------------------------------------------
////////////////////////////////////////////
//基于UDP连接的服务器端SOCKET程序//
////////////////////////////////////////////

#include <stdio.h>
#include <WINSOCK2.H>
//#include <windows.h>
//#include <iostream.h>
//#include <string.h>
#pragma comment(lib, "Ws2_32.lib")

void main()
{
//初始准备
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );//构造WORD结构的版号,makeword(hibyte,lobyte);

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
printf("Can't load the Winsock dll!\n");
return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
printf("not the right sock dll version!\n");
WSACleanup();
return;
}
//建立套接字
SOCKET sktSvr=socket(AF_INET,SOCK_DGRAM,0);
//设定主机地址结构
SOCKADDR_IN addrSvr;
addrSvr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//htonl(ADDR_ANY);
addrSvr.sin_family=AF_INET;
addrSvr.sin_port=htons(6000);
//绑定本机套接字,本地地址,地址长度;
bind(sktSvr,(SOCKADDR*)&addrSvr,sizeof(SOCKADDR));

SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);

char receiveBuffer[100]="";
char sendBuffer[100]="";
char tempBuffer[100]="";

while(1)
{
recvfrom(sktSvr,receiveBuffer,100,0,(SOCKADDR*)&addrClient,&len);
if ('q'==receiveBuffer[0])
{
sendto(sktSvr,"q",strlen("q")+1,0,(SOCKADDR*)&addrClient,len);
printf("chat end\n");
break;
}
sprintf(tempBuffer,"%s say: %s\n",inet_ntoa(addrClient.sin_addr),receiveBuffer);
printf("%s\n",tempBuffer);
printf("please input data:\n");
gets(sendBuffer);
sendto(sktSvr,sendBuffer,strlen(sendBuffer)+1,0,(SOCKADDR*)&addrClient,len);
}

closesocket(sktSvr);
WSACleanup();

}//--------------------------------------------------------------------------
//客户端代码如下:----------------------------------------------------------
////////////////////////////////////////////
//基于UDP连接的客户端SOCKET程序//
////////////////////////////////////////////

#include <stdio.h>
#include <WINSOCK2.H>
#include <iostream.h>
#pragma comment(lib, "Ws2_32.lib")

void main()
{
//初始准备
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );//构造WORD结构的版号,makeword(hibyte,lobyte);

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
cout<<"Can't load the Winsock dll!"<<endl;
return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
cout<<"not the right sock dll version!"<<endl;
WSACleanup();
return;
}
//建立套接字
SOCKET sktClient=socket(AF_INET,SOCK_DGRAM,0);
//设定主机地址结构
SOCKADDR_IN addrSvr;
addrSvr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSvr.sin_family=AF_INET;
addrSvr.sin_port=htons(6000);

// SOCKADDR_IN addrSr;
int len=sizeof(SOCKADDR);

char receiveBuffer[100]="";
char sendBuffer[100]="";
char tempBuffer[100]="";

while(1)
{
printf("please input data:\n");
gets(sendBuffer);
sendto(sktClient,sendBuffer,strlen(sendBuffer)+1,0,(SOCKADDR*)&addrSvr,len);
recvfrom(sktClient,receiveBuffer,100,0,(SOCKADDR*)&addrSvr,&len);
if ('q'==receiveBuffer[0])
{
sendto(sktClient,"q",strlen("q")+1,0,(SOCKADDR*)&addrSvr,len);
printf("chat is end!\n");
break;
}
sprintf(tempBuffer,"%s says: %s",inet_ntoa(addrSvr.sin_addr),receiveBuffer);
printf("%s\n",tempBuffer);

}

closesocket(sktClient);
WSACleanup();
}
//--------------------------------------------------------------------------
...全文
355 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lucksunok 2007-04-28
  • 打赏
  • 举报
回复
shenyi0106(紫色清风[if(1>0)while(1);]) ,well, thank u ful u participation, serryi0106,hehe
shenyi0106 2007-04-28
  • 打赏
  • 举报
回复
基于UDP的数据通讯,不能使用while(1){...}的结构,因为UDP的封包和TCP的不一样,UDP是一次把全部数据封在一个包里面,发送,因为它有结束符,不像TCP是流结构的,没有结束符.你这样无限发送的话,会导致接受方不知道该怎么接受
lucksunok 2007-04-28
  • 打赏
  • 举报
回复
太感谢两仁兄的提醒了,换个端口号,好了!!!一人10分吧,!!!我可以加两位的QQ吗?如果不嫌弃的话,我的QQ:58823039!!!
lucksunok 2007-04-28
  • 打赏
  • 举报
回复
哦,错误号是10022,获取了不可用的clientIP好像,也就是说收到到client端的数据。我再试试其它端口吧!
ouyh12345 2007-04-28
  • 打赏
  • 举报
回复
用WSAGetLastError,看错误号是多少
hit_ql 2007-04-28
  • 打赏
  • 举报
回复
你换一个端口试一试,6000端口有时是不可用的。
随便用一个别的应用程序的端口,像bt的6881应给就能够用了。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧