一个极简单的例子,就是通不过。请高手指点迷津,
还有请问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