socket网络编程之服务器端

参考:吴秦(Tyler) 大佬的文章

本地配置: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的区别

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值