2024年3月3日发(作者:)
linux tcp 编程 c语言
TCP编程是一种常见的网络编程方式,用于建立可靠的网络连接并传输数据。在Linux系统中,可以使用C语言编写TCP程序,以下是一些常用的TCP编程函数和代码示例。
1. socket函数:创建一个新的套接字。
```c。
#include
int socket(int domain, int type, int protocol);。
```。
参数:
- domain:地址族,通常为AF_INET。
- type:套接字类型,通常为SOCK_STREAM(流式套接字)。
- protocol:协议,通常为0(表示使用默认协议)。
返回值:新的套接字的文件描述符。
示例:
```c。
int sockfd = socket(AF_INET, SOCK_STREAM, 0);。
if(sockfd < 0) 。
perror("socket error");。
exit(1);。
}。
```。
2. bind函数:将套接字绑定到一个本地地址。
```c。
#include
int bind(int sockfd, const struct sockaddr *addr, socklen_t
addrlen);。
```。
参数:
- sockfd:套接字的文件描述符。
- addr:本地地址结构体,结构体类型为struct sockaddr(需要转换为实际的地址类型)。
- addrlen:地址结构体的长度。
返回值:0表示成功,-1表示失败。
示例:
```c。
struct sockaddr_in servaddr;。
memset(&servaddr, 0, sizeof(servaddr));。
_family = AF_INET;。
_addr.s_addr = htonl(INADDR_ANY);。
_port = htons(SERV_PORT);。
if(bind(sockfd, (struct sockaddr *)&servaddr,
sizeof(servaddr)) < 0) 。
perror("bind error");。
exit(1);。
}。
```。
3. listen函数:将套接字设置为监听状态,等待客户端连接。```c。
#include
int listen(int sockfd, int backlog);。
```。
参数:
- sockfd:套接字的文件描述符。
- backlog:等待连接的最大队列长度。
返回值:0表示成功,-1表示失败。
示例:
```c。
if(listen(sockfd, LISTENQ) < 0) 。
perror("listen error");。
exit(1);。
}。
```。
4. accept函数:接受客户端的连接请求,并返回一个新的套接字,用于与客户端通信。
```c。
#include
int accept(int sockfd, struct sockaddr *addr, socklen_t
*addrlen);。
```。
参数:
- sockfd:套接字的文件描述符。
- addr:客户端地址结构体,结构体类型为struct sockaddr(需要转换为实际的地址类型)。
- addrlen:地址结构体的长度,需要初始值为sizeof(struct
sockaddr),accept函数会更新其值为客户端地址结构体的实际长度。
返回值:新的套接字的文件描述符。
示例:
```c。
struct sockaddr_in cliaddr;。
socklen_t clilen = sizeof(cliaddr);。
int connfd = accept(sockfd, (struct sockaddr *)&cliaddr,
&clilen);。
if(connfd < 0) 。
perror("accept error");。
exit(1);。
}。
```。
5. connect函数:向指定的服务器建立连接。
```c。
#include
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);。
```。
参数:
- sockfd:套接字的文件描述符。
- addr:服务器地址结构体,结构体类型为struct sockaddr(需要转换为实际的地址类型)。
- addrlen:地址结构体的长度。
返回值:0表示成功,-1表示失败。
示例:
```c。
struct sockaddr_in servaddr;。
memset(&servaddr, 0, sizeof(servaddr));。
_family = AF_INET;。
_port = htons(SERV_PORT);。
if(inet_pton(AF_INET, SERV_ADDR, &_addr)
perror("inet_pton error");。
exit(1);。
}。
if(connect(sockfd, (struct sockaddr *)&servaddr,
sizeof(servaddr)) < 0) 。
perror("connect error");。
exit(1);。
}。
<= 0) 。
```。
6. send函数和recv函数:发送和接收数据。
```c。
#include
#include
ssize_t send(int sockfd, const void *buf, size_t len, int
flags);。
ssize_t recv(int sockfd, void *buf, size_t len, int flags);。
```。
参数:
- sockfd:套接字的文件描述符。
- buf:发送或接收的数据缓冲区。
- len:数据的长度。
- flags:发送或接收数据的选项,通常为0。
返回值:成功时返回发送或接收的数据长度,失败时返回-1。
示例:
```c。
char buf[MAXLINE];。
scanf("%s", buf);。
if(send(connfd, buf, strlen(buf), 0) < 0) 。
perror("send error");。
exit(1);。
}。
memset(buf, 0, sizeof(buf));。
if(recv(connfd, buf, MAXLINE, 0) < 0)
perror("recv error");。
exit(1);。
}。
printf("Received: %sn", buf);。```。
7. close函数:关闭套接字。
```c。
#include
int close(int fd);。
```。
参数:
- fd:套接字的文件描述符。
返回值:0表示成功,-1表示失败。。
示例:
```c。
close(sockfd);。
close(connfd);。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1709451911a1628187.html
评论列表(0条)