套接字编程常用函数

基本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 }

 基本UDP套接字编程

recvfrom和sendto函数

类似于标准的read和write函数

#include <sys/socket.h>

// 从套接字sockfd的接受缓冲区中读取nbytes字节的数据写入到指针buff所指向的位置
// 将发送此数据的对端的协议地址用from返回
ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen);

// 将指针buff指向的位置存放的nbytes字节的数据发送到协议地址为to的对端
ssize_t sendto(int sockfd, void *buff, size_t nbytes, int flags, struct sockaddr *to, socklen_t *addrlen);

// 上述两个函数调用成功时返回读或写的字节数,出错返回-1

 

转载于:https://www.cnblogs.com/lnlin/p/9381339.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Delphi中,套接字(Socket)编程用到的基本类是TServerSocket与TClientSocket。这两个类全部位于ScktComp单元中。其类型定义如下: type TServerSocket = class (ScktComp.TCustomServerSocket); TClientSocket = class (ScktComp.TCustomSocket)。      在编写程序时,首先要对TServerSocket(在服务器端)与TClientSocket(在客户端)进行实例化。对于TServerSocket的对象,主要设置其服务类型(ServerType)与端口(Port)的属性,然后编写“OnClientRead”事件处理程序的代码,处理来自客户机的请求。如要启动服务器,设置TServerSocket对象的Active属性为真(即Active := True),如要停止服务器,则设置TServerSocket对象的Active属性为假(即Active := False)。      对于TClientSocket的对象,主要设置对方服务器的服务类型(ServerType)、端口(Port)以及IP地址(Address)的属性,之后编写“OnConnect与OnRead”事件处理程序的代码“OnConnect”事件处理程序用来检查与服务器连接成功与否(必须在这里进行检查才有效),“OnRead”事件处理程序用来读取服务器发来的信息。如要连接服务器,设置TClientSocket对象的Active属性为真(即Active := True;注意:检查连接是否成功,必须在“OnConnect”事件处理程序中进行),如要断开与服务器的连接,则设置TClientSocket对象的Active属性为假(即Active := False)。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值