TCP套接字编程常用函数

socket函数

这是一个进程在执行网络I/O之前必须调用的函数,用于指定期望的通信协议类型

#include <sys/socket.h>

int socket(int family, int type, int protocol);   // 调用成功返回非负的套接字描述符,出错返回-1

connect函数

TCP客户端用connect函数来建立与TCP服务器的连接

#include <sys/socket.h>

int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);   // 调用成功返回0,出错返回-1

bind函数

bind函数用于将一个本地协议地址赋予一个套接字

#include <sys/socket.h>

int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);   // 调用成功返回0,出错返回-1

listen函数

listen函数仅由TCP服务器调用,listen函数将一个未连接的套接字转换成一个被动套接字,指
示内核应接受指向该套接字的连接请求。除此之外, listen函数规定了内核应该为相应套接字
排队的最大连接个数(backlog = 未完成连接队列 + 已完成连接队列, 内核允许在这个套接字
上排队的最大客户连接数)。

#include <sys/socket.h>

int listen(int sockfd, int backlog);   // 调用成功返回0,出错返回-1

accept函数

accept函数由TCP服务器调用,用于从已完成连接队列头返回下一个已完成连接

#include <sys/socket.h>

// cliaddr、addrlen用于返回已连接对端进程(客户)的协议地址
// 调用成功返回非负描述符,出错返回-1
int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);  

close函数

close函数可用于关闭套接字,并终止TCP连接

#include <unistd.h>

int close(int sockfd);     // 调用成功返回0,出错返回-1

getsockname函数和getpeername函数

这两个函数用于返回与某个套接字关联的本地协议地址(getsockname),或者返回与某个套接字
关联的外地协议地址(getpeername)

#include <sys/socket.h>

int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen);   // 调用成功返回0,出错返回-1

int getpeername(int sockfd, struct sockaddr *peeraddr, socklen_t *addrlen);    // 调用成功返回0,出错返回-1

用于获取个设置套接字选项

#include <sys/socket.h>

// 调用成功返回0,出错返回-1
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);       

// 调用成功返回0,出错返回-1
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);   

示例:简单的时间获取程序————客户端和服务端实现

 1 #include "net.h"
 2
 3 #define SA struct sockaddr
 4
 5 int main(int argc, char **argv)
 6 {
 7     int sockfd, n;
 8     char recvline[MAXLINE + 1];
 9     struct sockaddr_in servaddr;
10
11     if (argc != 2)
12     {
13         printf("Error: Options!\n");
14           return -1;
15     }
16
17     if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
18     {
19         printf("Error: Socket!\n");
20           return -1;
21     }
22
23     bzero(&servaddr, sizeof(servaddr));
24     servaddr.sin_family = AF_INET;
25     servaddr.sin_port = htons(13);
26
27     if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
28     {
29         printf("Error: inet_pton for %s\n", argv[1]);
30                 return -1;
31     }
32
33     if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
34     {
35         printf("Error: Connect!\n");
36     }
37
38     while ( (n = read(sockfd, recvline, MAXLINE)) > 0 )
39     {
40         recvline[n] = ‘\0‘;
41
42               if (fputs(recvline, stdout) == EOF)
43               {
44                         printf("Error: Fputs!\n");
45               }
46     }
47
48     if (n < 0)
49     {
50         printf("Erroe: Read!\n");
51     }
52
53     return 0;
54 }
 1 #include "net.h"
 2
 3 #define SA struct sockaddr
 4
 5 int main(int argc, char **argv)
 6 {
 7     int listenfd, connfd;
 8     struct sockaddr_in servaddr;
 9     char buff[MAXLINE];
10     time_t ticks;
11
12     if ( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
13     {
14         printf("Error: Socket!\n");
15                 return -1;
16     }
17
18     bzero(&servaddr, sizeof(servaddr));
19     servaddr.sin_family = AF_INET;
20     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
21     servaddr.sin_port = htons(13);
22
23     if (bind(listenfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
24     {
25         printf("Error: Bind!\n");
26                 return -1;
27     }
28
29     if (listen(listenfd, LISTENQ) < 0)
30     {
31         printf("Error: Listen!\n");
32                 return -1;
33     }
34
35     for ( ; ; )
36     {
37         if ( (connfd = accept(listenfd, (SA *) NULL, NULL)) < 0 )
38         {
39             printf("Error: Accept!\n");
40             return -1;
41         }
42
43                 ticks = time(NULL);
44                 snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
45
46                 if (write(connfd, buff, strlen(buff)) < 0)
47                 {
48                     printf("Error: Write!\n");
49                     return -1;
50                 }
51
52                 if (close(connfd) < 0)
53                 {
54                     printf("Error: Close!\n");
55                     return -1;
56                 }
57     }
58
59     return 0;
60 }

原文地址:https://www.cnblogs.com/lnlin/p/9381339.html

时间: 2024-08-01 19:53:11

TCP套接字编程常用函数的相关文章

【UNIX网络编程(二)】基本TCP套接字编程函数

基于TCP客户/服务器程序的套接字函数图如下: 执行网络I/O,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型. #include <sys/socket.h> int socket(int family, int type, int protocol);/*返回值:若成功则为非负描述符,若出错则为-1*/ socket函数成功时返回一个小的非负整数值,它与文件描述符类似,把它称为套接字描述符,简称sockfd.family参数指明协议族,被称为协议域.type参数指

《网络编程》基本 TCP 套接字编程

在进行套接字编程之前必须熟悉其地址结构,有关套接字的地址结构可参考文章<套接字编程简介>.基于 TCP 的套接字编程的所有客户端和服务器端都是从调用socket 开始,它返回一个套接字描述符.客户端随后调用connect 函数,服务器端则调用 bind.listen 和accept 函数.套接字通常使用标准的close 函数关闭,但是也可以使用 shutdown 函数关闭套接字.下面针对套接字编程实现过程中所调用的函数进程分析.以下是基于 TCP 套接字编程的流程图: socket 函数 套接

Unix网络编程之基本TCP套接字编程(上)

TCP客户/服务器实例 服务器程序 #include "unp.h" int main(int argc, char **argv) { int listenfd, connfd; pid_t childpid; socklen_t clilen; struct sockaddr_in cliaddr, servaddr; listenfd = Socket(AF_INET, SOCK_STREAM, 0); //1 bzero(&servaddr, sizeof(servad

《网络编程》基于 TCP 套接字编程的分析

本节围绕着基于 TCP 套接字编程实现的客户端和服务器进行分析,首先给出一个简单的客户端和服务器模式的基于 TCP 套接字的编程实现,然后针对实现过程中所出现的问题逐步解决.有关基于 TCP 套接字的编程过程可参考文章<基本 TCP 套接字编程>.该编程实现的功能如下: (1)客户端从标准输入读取文本,并发送给服务器: (2)服务器从网络输入读取该文本,并回射给客户端: (3)客户端从网络读取由服务器回射的文本,并通过标准输出回显到终端: 简单实现流图如下:注:画图过程通信双方是单独的箭头,只

【UNIX网络编程(四)】TCP套接字编程详细分析

引言: 套接字编程其实跟进程间通信有一定的相似性,可能也正因为此,stevens这位大神才会将套接字编程与进程间的通信都归为"网络编程",并分别写成了两本书<UNP1><UNP2>.TCP套接字编程是套接字编程中非常重要的一种,仔细分析,其实它的原理并不复杂.现在就以一个例子来详细分析TCP套接字编程. 一.示例要求: 本节中试着编写一个完成的TCP客户/服务器程序示例,并对它进行深入的探讨.该示例会用到绝大多数的基本函数,未用到但比较重要的函数会在后面的补充上

UNIX网络编程笔记(3)—基本TCP套接字编程

基本TCP套接字编程 主要介绍一个完整的TCP客户/服务器程序需要的基本套接字函数. 1.概述 在整个TCP客户/服务程序中,用到的函数就那么几个,其整体框图如下: 2.socket函数 为了执行网络I/O,一个进程必须要做的事情就是调用socket函数.其函数声明如下: #include <sys/socket.h> int socket(int family ,int type, int protocol); 其中: family:指定协议族 type:指定套接字类型 protocol:指

第4章 基本tcp套接字编程

4.1 各种套接字api(重要) 4.1.1 socket() 用于创建一个套接字描述符,这个描述符指明的是tcp还是udp,同时还有ipv4还是ipv6 #include <sys/socket.h>?int socket(int family, int type, int protocol);//成功返回描述符,错误-1 family主要是指明的协议族,AF_INET:ipv4.AF_INET6:ipv6 .AF_LOCAL:unix域协议.AF_ROUTE:路由套接字.AF_KEY秘钥套

套接字编程相关函数(2:TCP套接字编程相关函数)

1. 基本TCP客户/服务器程序的套接字函数 2. socket函数 为了执行网络I/O,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型.其定义如下: #include <sys/socket.h> int socket(int family, int type, int protocol); // 返回:若成功则返回非负描述符,若失败则返回-1 其中:family参数指明协议族,它是图4-2中所示的某个常值.该参数也往往被称为协议域. type指明套接字类型,它是图

UNP学习笔记(第四章 基本TCP套接字编程)

本章讲解编写一个完整的TCP客户/服务器程序所需要的基本套接字函数. socket函数 #include <sys/socket.h> int socket(int family,int type,int protocol); //返回:成功则为非负描述符,若出错则为-1 family参数指明协议族,它是如下某个常值 type参数指明套接字类型,它是如下某个常值 protocol参数为下面某个协议类型常值,或者设为0,以选择所给定family和type组合的系统默认值 下图展示了基本TCP客户