本地配置:vs2013
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<winsock2.h>
#define MAXLINE 4096
int main(int argc, char** argv)
{
int listenfd, connfd;
struct sockaddr_in servaddr;
char buff[4096]; int n;
/*使用socket函数前先注册,参考https://blog.csdn.net/CaptainUsop/article/details/78286454?utm_source=blogxgwz4*/
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
printf("hahahahahahahahahahahahaha");
exit(0);
}
/*************************************************************************************/
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("create socket error");
exit(0);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(6666);
if (bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
{
printf("bind socket error");
exit(0);
}
if (listen(listenfd, 10) == -1)
{
printf("listen socket error");
exit(0);
}
printf("======waiting for client's request======\n");
while (1)
{
if ((connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1)
{
printf("accept socket error");
continue;
}
n = recv(connfd, buff, MAXLINE, 0); buff[n] = '\0'; printf("recv msg from client: %s\n", buff);
closesocket(connfd);
}
closesocket(listenfd);
system("pause");
return 0;
}
说说碰到的几个坑吧:
1.参考的文章用的linux系统,要包含的头文件和windows系统略微有些差别,例如:#include<netinet/in.h>是在linux下使用,而windows使用的是#include<winsock2.h>等;
2.closesocket函数替代了close函数;
3.socket函数的返回值一直是-1,各种百度各种google后发现使用socket函数前要先注册;
4.编译一直提示“error LNK2019: 无法解析的外部符号 _socket@12,该符号在函数 _main 中被引用”之类,csdn上的大佬给的解决方案是“项目->属性->配置属性->链接器->输入->附加依赖项里添加“ws2_32.lib””;
关于“winsock.h”和“winsock2.h”的区别可以参考winsock和winsock2的区别