首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

一个极简单的例子,就是通不过。请迷津

2012-01-19 
一个极简单的例子,就是通不过。请高手指点迷津,还有请问SOCKETsocket(AF_INET,SOCK_STREAM,0)已经建立了soc

一个极简单的例子,就是通不过。请高手指点迷津,
还有请问SOCKET   socket(AF_INET,SOCK_STREAM,0)
已经建立了socke为什么还要accept返回socket类型
着两个socket区别是什么
//extern   "C "
//{
#include   <Winsock2.h>
#include   <stdio.h>
//}
int   main()
{
WORD   wVersionRequested;
WSADATA   wsaData;
int   err;

wVersionRequested   =  
MAKEWORD(1,1);         //   高字节,低字节

//   一是加载套接字库,二是进行套接字库的版本协商,也就是确定版本,
err=WSAStartup(
wVersionRequested,                           /*   高字节副版本,低字节主版本                       */
&wsaData                                           /*   这是个出口地址,装在库版本的有关信息   */
);
if   (err!=0)
{
return   1;
}
//   证明加载不成功,释放资源
if   (LOBYTE(wsaData.wVersion)!=1   ||   HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup();
return   2;
}

//创建用于监听的套接字
SOCKET   sockSrv   =   socket(
AF_INET,                                                   /*   tcp/ip   协议   */
SOCK_STREAM,                                           /*   tcp   or   udp   */
0                                                                 /*   自动   */
);
SOCKADDR_IN   addrSrv;                                   /*     */
addrSrv.sin_addr.S_un.S_addr   =   htonl(INADDR_ANY);         /*     */
addrSrv.sin_family   =   AF_INET;                 /*   地址簇为ip地址   */
addrSrv.sin_port   =   htons(6000);             /*   端口   */

//bind套接字绑定
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

//将套接字设为监听模式,准备接受客户请求
listen(sockSrv,5);                                       /*  
  套接字描述符,等待链接
  队列的最大长度   (   如果  
  设为SOMAXCONN,那么下层
  就给个可能的最大值   )
  */

SOCKADDR_IN   addrClient;
int   len=sizeof(SOCKADDR);

while(1)
{
//等待客户请求到来
SOCKET   sockConn=accept(
sockSrv,                                           //套接字描述符
(SOCKADDR*)&addrClient,             //客户机信息(ip   &&   port)保存的地址
&len                                                   //地址信息的长度
);



char   sendBuf[100];
//发送数据
sprintf(
sendBuf,                                               //
"welcome   %s   ",                                   //
inet_ntoa(addrClient.sin_addr)   //
);
send(
sockConn,                                             //套接字
sendBuf,                                               //发送内容缓冲区的地址
strlen(sendBuf)+1,                           //缓冲区的长度
0                                                             //flag一般为0
);

char   recvBuf[100];
//接收数据
recv(
sockConn,                                             //套接字
recvBuf,                                               //接收预留的缓冲区
100,                                                       //缓冲区长度
0                                                             //flag一般为0
);
//打印接收的数据
printf( "%s\n ",recvBuf);
closesocket(sockConn);
}
return   0;
}

[解决办法]
LNK2019经常是调用约定设置得不同造成的。
[解决办法]
在include语句下面添加下面一行:

#pragma comment(lib, "ws2_32.lib ")

sprintf的第一个参数是接收输出的字符串缓冲区,第2个参数及之后同printf
例如:
char s[10];

sprintf(s, "%d ", 123);
此时s中存放字符“123”
[解决办法]
#pragma once
同样的错误只警告一次,
其他的#pragma,可以上网去搜索,满多的资料!
[解决办法]
#pragma comment(lib, "ws2_32.lib "):连接的时候包含ws2_32.lib

热点排行