经过了一个多星期的学习,我在这里总结一下关于Linux,Windows的socket TCP通信的不同情形。
- server,client之间的通信
https://blog.csdn.net/wesigj/article/details/99294538 - Socket之TCP全双工Server-Client通信
https://blog.csdn.net/wesigj/article/details/99322695 - client,client之间的通信
- 一个小应用-------网络聊天室https://blog.csdn.net/wesigj/article/details/99418596
- Linux与Windows之间的socket通信
- socket实现两台pc之间的数据传输功能,包括windows到linux,TCP/IP
文章目录
所需要的库文件
- #include <stdio.h>
使用预处理指令 #include 可以引用用户和系统头文件。它的形式有以下两种:
#include
这种形式用于引用系统头文件。它在系统目录的标准列表中搜索名为 file 的文件。在编译源代码时,您可以通过 -I 选项把目录前置在该列表前。
#include “file”
这种形式用于引用用户头文件。它在包含当前文件的目录中搜索名为 file 的文件。
引用头文件的操作
#include 指令会指示 C 预处理器浏览指定的文件作为输入。预处理器的输出包含了已经生成的输出,被引用文件生成的输出以及 #include 指令之后的文本输出。 - #include <stdlib.h>
stdlib 头文件即standard library标准库头文件。stdlib.h里面定义了五种类型、一些宏和通用工具函数。 类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t; 宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX和MB_CUR_MAX等等; 常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。 具体的内容可以打开编译器的include目录里面的stdlib.h头文件查看。 - #include <string.h>
C语言标准库中一个常用的头文件,在使用到字符数组时需要使用。string .h 头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。
常用函数如下:
strlen求字符串长度
strcmp比较2个字符串是否一样
strcat字符串连接操作
strcpy字符串拷贝操作
strncat字符串连接操作(前n个字符)
strncpy字符串拷贝操作(前n个字符)
strchr查询字串
strstr 查询子串 - #include <unistd.h>
是POSIX标准定义的unix类系统定义符号常量的头文件,包含了许多UNIX系统服务的函数原型,例如read函数、write函数和getpid函数。
对于类 Unix 系统,unistd.h 中所定义的接口通常都是大量针对系统调用的封装(英语:wrapper functions),如 fork、pipe 以及各种 I/O 原语(read、write、close 等等)。
类似于 Cygwin 和 MinGW 的 Unix 兼容层也提供相应版本的 unistd.h。 - #include <fcntl.h>
fcntl.h与unistd.h
fcntl.h定义了很多宏和open,fcntl函数原型
unistd.h定义了更多的函数原型
close(关闭文件)
表头文件#include<unistd.h>
定义函数int close(int fd);
函数说明当使用完文件后若已不再需要则可使用close()关闭该文件,二
close()会让数据写回磁盘,并释放该文件所占用的资源。参数fd为
先前由open()或creat()所返回的文件描述词。
返回值若文件顺利关闭则返回0,发生错误时返回-1。
错误代码EBADF 参数fd 非有效的文件描述词或该文件已关闭。
附加说明虽然在进程结束时,系统会自动关闭已打开的文件,但仍建议自行
关闭文件,并确实检查返回值。(系统可能有缓冲,在适当的时候才写入,特别是NFS网络文件系统)
open(打开文件) - #include <sys/shm.h>
<sys/shm.h> 共享存储 - #include <sys/types.h>
基本系统数据类型
是Unix/Linux系统的基本系统数据类型的头文件,含有size_t,time_t,pid_t等类型。linux编程中经常用到的头文件。 - #include <netinet/in.h>
1、socketaddr_in 结构体
struct sockaddr_in
eg:
#define SERV_PORT 6666
struct sockaddr_in serveraddr;
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(SERV_PORT);
htons系统调用
extern uint16_t htons (uint16_t __hostshort)
__THROW attribute ((const));
htons是将整型变量从主机字节顺序转变成网络字节顺序, 就是整数在地址空间存储方式变为高位字节存放在内存的低地址处。
网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释,网络字节顺序采用big-endian排序方式。
-
#include <sys/socket.h>
创建套接字: socket()
绑定本机端口: bind()
建立连接: connect(),accept()
侦听端口: listen()
数据传输: send(), recv()
输入/输出多路复用: select()
关闭套接只: closesocket() -
#include <arpa/inet.h>
/* Convert from presentation format of an Internet number in buffer
starting at CP to the binary network format and store result for
interface type AF in buffer starting at BUF. */
extern int inet_pton (int __af, __const char *__restrict __cp,