用socket api写的通信程序客户端老是报错10038,求救!求救!

wesleyluo 2009-07-08 08:44:04
我用的是C++BUILDER工具编写的,主要是sockaddr_in结构中的.sin_addr.S_un.S_addr有点区别,其他的我就不知道了,
请大侠指教啊。
我的客户端代码:

int main(int argc, char* argv[])
{
int iResult;
SOCKET MySocket=INVALID_SOCKET;
struct sockaddr_in MyAddr;
WSADATA wsaData;
char *DATA="it's good.";
//initialization socket
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0)
{
printf("WSAStartup failed: %d\n", iResult);
return 1;
}
if((MySocket=socket(AF_INET,SOCK_STREAM,0)==INVALID_SOCKET))
{
printf("socket error, lasterror: %d\n",WSAGetLastError());
return 1;
}

//connect socket
memset((void*)&MyAddr,0,sizeof(MyAddr));
MyAddr.sin_family=AF_INET;
MyAddr.sin_port=htons(5000);
MyAddr.sin_addr.S_un.S_addr=inet_addr("172.17.161.46");//服务器的IP:172.17.161.46
if(connect(MySocket,(struct sockaddr *)&MyAddr,sizeof(struct sockaddr))==SOCKET_ERROR)
{
printf("connect error ,lasterror :%d\n",WSAGetLastError());//老是在这里报错errorcode:10038
getch();
exit(1);
}
//send data to server
if(send(MySocket,DATA,sizeof(DATA),0)<0)
perror("sending on stream socket");

closesocket(MySocket);
getch();
return 0;
}

我的服务器端程序代码:

int main(int argc, char* argv[])
{
int sock,length;
struct sockaddr_in server;
struct sockaddr tcpaddr;
int msgsock;
char buf[1024];
int rval,len;

//initialization socket
WSADATA wsaData;
WSAStartup(MAKEWORD(2,0),&wsaData);

//create new socket
sock=socket(AF_INET,SOCK_STREAM,0);
if(sock<0)
{
perror("opening stream socket");
printf("sock=%d\n",sock);
getch();
exit(1);
}

//bind the socket
server.sin_family=AF_INET;
server.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
server.sin_port=INADDR_ANY;//htons(5000);
if(bind(sock,(struct sockaddr *)&server,sizeof(server))<0)
{
perror("binding stream socket");
printf("lasterror: %d\n",WSAGetLastError());
getch();
exit(1);
}

length=sizeof(server);
if(getsockname(sock,(struct sockaddr *)&server,&length)<0)
{
perror("getting socket name");
getch();
exit(1);
}
printf("socket port # %d\n",ntohs(server.sin_port));

//listen socket
listen(sock,5);
len=sizeof(struct sockaddr);
do
{
msgsock=accept(sock,(struct sockaddr *)&tcpaddr,(int *)&len);
if(msgsock==-1)
perror("accept");
else do
{
memset(buf,0,sizeof(buf));
if((rval=recv(msgsock,buf,1024,0))<0)
perror("reading stream message");
if(rval==0)
printf("ending connection \n");
else
printf("---->%s\n",buf);
}while(rval!=0);
closesocket(msgsock);
}while(TRUE);

getch();
return 0;
}
...全文
305 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
westbb_03 2009-11-09
  • 打赏
  • 举报
回复
我指定1001端口,调通了,哪个括号适合关键的,不知道为啥
w20011025 2009-07-13
  • 打赏
  • 举报
回复
study ...
wesleyluo 2009-07-08
  • 打赏
  • 举报
回复
楼上的兄弟,通过你的指教我成功实现了。
感谢!
大前置 2009-07-08
  • 打赏
  • 举报
回复
如果是:172.17.161.46

先ping一下,确定通讯正常
大前置 2009-07-08
  • 打赏
  • 举报
回复
10061 错误给你解释下:
WSAECONNREFUSED 10061 连接被拒绝,由于被目标机器拒绝,连接无法直接建立,这通常是由于远程机器上,没有任何应用程序可以在那个地址上,为连接提供服务。
主机没有开通服务


下面有问题:
MyAddr.sin_addr.S_un.S_addr=inet_addr("172.17.161.46");//服务器的IP:172.17.161.46
server.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

要么本地链接,要么internet链接:
本地测试,用127.0.0.1吧
不同主机上测试:用172.17.161.46

我在UNIX开发也出现这种问题,这是由socket本地套接字引起的

不知道windows是否是这样
可以改过来测试一下
wesleyluo 2009-07-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 goodname 的回复:]
服务器应该指定端口
server.sin_port=htons(5000);
[/Quote]
服务器上的端口指定成5000,客户端还是报10061的错误。

还会是什么问题呢?
  • 打赏
  • 举报
回复
server.sin_port=INADDR_ANY;//htons(5000);


改过来看下
Fleeboy 2009-07-08
  • 打赏
  • 举报
回复
学习
goodname 2009-07-08
  • 打赏
  • 举报
回复
服务器应该指定端口
server.sin_port=htons(5000);
wesleyluo 2009-07-08
  • 打赏
  • 举报
回复
感谢上面的大侠们给我解决的问题。
但是下面它还是在connect的地方显示错误errorcode:10061 远端服务器拒绝 是怎么回事啊?
大前置 2009-07-08
  • 打赏
  • 举报
回复

if((MySocket=socket(AF_INET,SOCK_STREAM,0)==INVALID_SOCKET))
括号 括错了

MySocket不等于你socket出来的编号

connet没有资源的编号,会出现10038错误

晨星 2009-07-08
  • 打赏
  • 举报
回复
唉,==优先级更高。
还是尽量不要在if里搞赋值加判等了。:(
  • 打赏
  • 举报
回复
Socket error 10038 - Socket operation on non-socket

if((MySocket=socket(AF_INET,SOCK_STREAM,0)==INVALID_SOCKET))

加个括号保证赋值的优先级。

http://topic.csdn.net/t/20031202/12/2517976.html
hduzn 2009-07-08
  • 打赏
  • 举报
回复
Socket的呀,还没学,帮顶啦~~
goodname 2009-07-08
  • 打赏
  • 举报
回复
if((MySocket=socket(AF_INET,SOCK_STREAM,0)==INVALID_SOCKET))

改为--->
if((MySocket=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET)
setsailgo 2009-07-08
  • 打赏
  • 举报
回复
这个错误代码表示的意思是"在一个非套接口上尝试一个操作".
用C:\Program Files\Microsoft Visual Studio\Common\Tools\ERRLOOK.EXE可以查询
vs6工具菜单里有,就是Error lookup

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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