【C语言实现windows环境下Socket编程TCP/IP协议】

这篇具有很好参考价值的文章主要介绍了【C语言实现windows环境下Socket编程TCP/IP协议】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

主要是记录解决一些在我本地编译运行时出现的问题

代码是别人的,问题是我的。顺便记录一下遇见的各种问题和我的解决办法。

connect :No error

可能的解决方案:
1、服务端和客户端不在一个局域网,可以开热点,这样就在了。然后ipconfig查看IP地址,就ok了。至于怎么查看在不在就ping一下对方就好了。
2、一个局域网下也ping不通:看看自己和对方的防火墙有没有关,有些时候不关就ping不通。

关于头文件

1、#include <sys/types.h>、#include <sys/socket.h>、#include <netinet/in.h>、#include <arpa/inet.h>
这几个东西总是找不到,后面百度说是因为这是在linux系统下的库,在windows就不行,在windows里面用下面的头文件替代:

#include <winsock2.h>
#pragma comment(lib,“ws2_32.lib”)
#include <Ws2tcpip.h>

关于stray /xxx和socket:No error问题

搜集到的问题解释是因为没有初始化socket。
在建立套接字前加以下代码即可:

WSADATA wsaData;
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){
	perror("WSADATA失败");
}

小tip:如果直接复制进你的代码还出现报错(貌似是格式问题),可以尝试手敲上述代码可解决。

千万记得是服务器先启动哦,客户端后启动

下面附上我改好的代码

参考博客:C语言实现TCP通信
我改的代码 服务端.

#include <sys/stat.h>

#include <fcntl.h>

#include <errno.h>

#include <winsock2.h>
#pragma comment(lib,“ws2_32.lib”)

#include <sys/types.h>

#include <Ws2tcpip.h>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <unistd.h>

#define SERVER_PORT 6666

/*
监听后,一直处于accept阻塞状态,
直到有客户端连接,
当客户端如数quit后,断开与客户端的连接
*/

int main()

{
	
//调用socket函数返回的文件描述符
	
	int serverSocket;
	
//声明两个套接字sockaddr_in结构体变量,分别表示客户端和服务器
	
	struct sockaddr_in server_addr;
	
	struct sockaddr_in clientAddr;
	
	int addr_len = sizeof(clientAddr);
	
	int client;
	
	char buffer[200];
	
	int iDataNum;
	
//socket函数,失败返回-1
	
//int socket(int domain, int type, int protocol);
	
//第一个参数表示使用的地址类型,一般都是ipv4,AF_INET
	
//第二个参数表示套接字类型:tcp:面向连接的稳定数据传输SOCK_STREAM
	
//第三个参数设置为0
	WSADATA wsaData;
	if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){
		perror("WSADATA失败");
	}
	
	if((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
		
	{
		
		perror("socket");
		
		return 1;
		
	}
	
	bzero(&server_addr, sizeof(server_addr));
	
//初始化服务器端的套接字,并用htons和htonl将端口和地址转成网络字节序
	
	server_addr.sin_family = AF_INET;
	
	server_addr.sin_port = htons(SERVER_PORT);
	
//ip可是是本服务器的ip,也可以用宏INADDR_ANY代替,代表0.0.0.0,表明所有地址
	
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	 
//对于bind,accept之类的函数,里面套接字参数都是需要强制转换成(struct sockaddr *)
	
//bind三个参数:服务器端的套接字的文件描述符,
	
	if(bind(serverSocket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
		
	{
		
		perror("connect");
		
		return 1;
		
	}
	
//设置服务器上的socket为监听状态
	
	if(listen(serverSocket, 5) < 0)
		
	{
		
		perror("listen");
		
		return 1;
		
	}
	
	while(1)
		
	{
		
		printf("监听端口: %d\n", SERVER_PORT);
		
//调用accept函数后,会进入阻塞状态
		
//accept返回一个套接字的文件描述符,这样服务器端便有两个套接字的文件描述符,
		
//serverSocket和client。
		
//serverSocket仍然继续在监听状态,client则负责接收和发送数据
		
//clientAddr是一个传出参数,accept返回时,传出客户端的地址和端口号
		
//addr_len是一个传入-传出参数,传入的是调用者提供的缓冲区的clientAddr的长度,以避免缓冲区溢出。
		
//传出的是客户端地址结构体的实际长度。
		
//出错返回-1
		
		client = accept(serverSocket, (struct sockaddr*)&clientAddr, (socklen_t*)&addr_len);
		
		if(client < 0)
			
		{
			
			perror("accept");
			
			continue;
			
		}
		
		printf("等待消息...\n");
		
//inet_ntoa ip地址转换函数,将网络字节序IP转换为点分十进制IP
		
//表达式:char *inet_ntoa (struct in_addr);
		
		printf("IP is %s\n", inet_ntoa(clientAddr.sin_addr));
		
		printf("Port is %d\n", htons(clientAddr.sin_port));
		
		while(1)
			
		{
			
			printf("读取消息:");
			
			buffer[0] = '\0';
			
			iDataNum = recv(client, buffer, 1024, 0);
			
			if(iDataNum < 0)
				
			{
				
				perror("recv null");
				
				continue;
				
			}
			
			buffer[iDataNum] = '\0';
			
			if(strcmp(buffer, "quit") == 0)
				
				break;
			
			printf("%s\n", buffer);
			
			
			
			printf("发送消息:");
			
			scanf("%s", buffer);
			
			printf("\n");
			
			send(client, buffer, strlen(buffer), 0);
			
			if(strcmp(buffer, "quit") == 0)
				
				break;
			
		}
		
	}
	close(serverSocket);
	return 0;
}

我改的代码 客户端.文章来源地址https://www.toymoban.com/news/detail-765048.html

#include <sys/stat.h>

#include <fcntl.h>

#include <errno.h>

#include <winsock2.h>
#pragma comment(lib,“ws2_32.lib”)

#include <sys/types.h>

#include <Ws2tcpip.h>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <unistd.h>

#define SERVER_PORT 6666

/*
连接到服务器后,会不停循环,等待输入,
输入quit后,断开与服务器的连接
*/

int main()

{
	
//客户端只需要一个套接字文件描述符,用于和服务器通信
	WSADATA wsaData;
	if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){
		perror("WSADATA失败");
	}
	int clientSocket;
	
//描述服务器的socket
	
	struct sockaddr_in serverAddr;
	
	char sendbuf[200];
	
	char recvbuf[200];
	
	int iDataNum;
	
	if((clientSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
		
	{
		
		perror("socket");
		
		return 1;
		
	}
	
	serverAddr.sin_family = AF_INET;
	
	serverAddr.sin_port = htons(SERVER_PORT);
	
//指定服务器端的ip,本地测试:127.0.0.1
	
//inet_addr()函数,将点分十进制IP转换成网络字节序IP
	
	serverAddr.sin_addr.s_addr = inet_addr("服务端IP地址");
	
	if(connect(clientSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0)
		
	{
		
		perror("connect");
		
		return 1;
		
	}
	
	printf("连接到主机...\n");
	
	while(1)
		
	{
		
		printf("发送消息:");
		
		scanf("%s", sendbuf);
		
		printf("\n");
		
		send(clientSocket, sendbuf, strlen(sendbuf), 0);
		
		
		
		if(strcmp(sendbuf, "quit") == 0)
			
			break;
		
		printf("读取消息:");
		
		recvbuf[0] = '\0';
		
		iDataNum = recv(clientSocket, recvbuf, 200, 0);
		
		recvbuf[iDataNum] = '\0';
		
		printf("%s\n", recvbuf);
		
	}
	
	close(clientSocket);
	
	return 0;
	
}

到了这里,关于【C语言实现windows环境下Socket编程TCP/IP协议】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【socket编程】TCP服务器、UDP服务器、本地套接字【C语言代码实现】

    目录 0. 准备知识 0.1 大小端概念 0.2 网络字节序和主机字节序的转换 0.3 点分十进制串转换(IP地址转换函数) 0.4 IPV4结构体:(man 7 ip) 0.5 IPV6套接字结构体:(man 7 ipv6) 0.6 通用套接字结构体 1. 网络套接字函数 1.1 socket 1.2 connect 1.3 bind 1.4 listen 1.5 accept 1.6 端口复用 2. 包裹函

    2024年02月07日
    浏览(40)
  • socket套接字通信 TCP传输控制协议/IP网络协议 5.18

    B/S :浏览器和服务器 C/S :客户机和服务器 网络的层次结构和每层所使用协议的集合 网络采用分层管理的方法,将网络的功能划分为不同的模块 OSI模型: 共7种: 数据的封装与传递过程: 网络传输数据大小user data: 6~1460 网络传输中容易发生拆包和粘包,所以接收和发送的字节

    2024年02月05日
    浏览(65)
  • TCP/IP(十一)TCP的连接管理(八)socket网络编程

    一  socket网络编程  socket 基本操作函数 bind、listen、connect、accept、recv、send、select、close ①  针对 TCP 应该如何 Socket 编程? ②   listen 时候参数 backlog 的意义? ③  accept 发生在三次握手的哪一步? ④   客户端调用 close 了,连接是断开的流程是什么? ⑤  没有 accept,能建立 T

    2024年02月07日
    浏览(41)
  • Go语言TCP Socket编程

    Golang的主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少也是至关重要的一部分。在日常应用中,我们也可以看到Go中的net以及其subdirectories下的包均是“高频+刚需”,而TCP socket则是网络编程的主流,即便您没有直接使用到net中有关TCP

    2024年02月15日
    浏览(28)
  • Go语言网络编程(socket编程)TCP

    TCP协议 TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议,因为是面向连接的协议,数据像水流一样传输,会存在黏包问题。 TCP服务端 一个TCP服务端可以同时连接很

    2024年02月09日
    浏览(34)
  • Go语言网络编程(socket编程)TCP粘包

    服务端代码如下: 客户端代码如下: 将上面的代码保存后,分别编译。先启动服务端再启动客户端,可以看到服务端输出结果如下: 收到client发来的数据: Hello, Hello. How are you?Hello, Hello. How are you?Hello, Hello. How are you?Hello, Hello. How are you?Hello, Hello. How are you? 收到client发来的数

    2024年02月09日
    浏览(44)
  • Python网络编程基础之ip地址,端口号,TCP,socket

    IP地址 IP地址 (Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。 IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。 换而言之,IP 地址就是标识网络中设备的一个地址,好比

    2024年02月02日
    浏览(31)
  • Socket TCP/IP协议数据传输过程中的粘包和分包问题

    一:通过图解法来描述一下分包和粘包,这样客户更清晰直观的了解: 下面对上面的图进行解释: 1.正常情况:如果Socket Client 发送的数据包,在Socket Server端也是一个一个完整接收的,那个就不会出现粘包和分包情况,数据正常读取。 2.粘包情况:Socket Client发送的数据包,

    2024年02月12日
    浏览(33)
  • Qt6教程之三(13) TCP/IP通讯与socket编程

    目录 一 前言 二 TCP/IP协议架构和通信原理 三 TCP/IP的连接与断开过程 四 Qt中开发TCP/IP原理概述 五 完整实例代码示范 在软件开发中,常用的技术体系里面网络通信属于最重要的 “联通” 技术,是必须要掌握的技术。 那为什么网络通信如此重要呢,我想大概有以下几点: 不

    2024年02月12日
    浏览(29)
  • socket的使用 | TCP/IP协议下服务器与客户端之间传送数据

    谨以此篇,记录TCP编程,方便日后查阅笔记 注意:用BufferedWriter write完后,一定要flush;否则字符不会进入流中。去看源码可知:真正将字符写入的不是write(),而是flush()。 服务器端代码: 客户端代码: 运行后结果: 服务器端: 客户端: 参考资料: https://www.bilibili.com/vid

    2024年02月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包