套接字设置

1、套接字

在Linux的网络编程中,套接字是非常重要的,要想实现更复杂的应用,必定会涉及到调整套接字属性,使其能够实现地址重用,广播,数据缓存区等功能。

常用的API函数:

int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);

2、setsockopt()的理解

(1)、参数sockfd:用于指定要操作的套接字;

(2)、level:要查找的协议所对应的协议层;

a、SOL_SOCKET:通用套接字层

b、IPPROTO_IP:IP协议层,用于设置IP层

c、IPPROTO_TCP:TCP协议层,用于设置TCP。

(3)、optname:查表看要设置为什么功能

(4)、int yes = 1;   &yes

(5)、sizeof(int);

  关键点:必须要在绑定(bind()函数)之前设置套接字,调用setsockopt();

3、套接字的查询表

4、代码实现

(1)、ser.c

#include<unistd.h>
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>

int main(int argc, char *argv[]){
    int sockSer = socket(AF_INET, SOCK_STREAM, 0); 
    struct sockaddr_in addrSer, addrCli;
    addrSer.sin_family = AF_INET;
    addrSer.sin_port = htons(atoi(argv[2]));
    addrSer.sin_addr.s_addr = inet_addr(argv[1]);

    int yes = 1;
    setsockopt(sockSer, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));//设置的是允许本地端口和地址重用

    struct timeval timeout; //设置等待时间(这样将阻塞程序——>非阻塞程序)
    timeout.tv_sec = 5;  //秒
    timeout.tv_usec = 0;  //微秒
    setsockopt(sockSer, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(struct timeval));//设置的是服务器最多等客户端5秒

    socklen_t len = sizeof(struct sockaddr);
    int res = bind(sockSer,(struct sockaddr*)&addrSer, len);
    if(res == -1){
        perror("bind");
        close(sockSer);
        return -1;
    }

    listen(sockSer, 5);

    int sockConn;
    sockConn = accept(sockSer, (struct sockaddr*)&addrCli, &len);

    char buffer[256];
    while(1){
        recv(sockConn, buffer, 256, 0);
        printf("recv msg from client :> %s\n",buffer);
        send(sockConn, buffer, strlen(buffer)+1, 0);
    }
    close(sockSer);

    return 0;

(2)、cli.c

#include<unistd.h>
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>

int main(int argc, char *argv[]){
    int sockCli = socket(AF_INET, SOCK_STREAM, 0); 
    struct sockaddr_in addrSer;
    addrSer.sin_family = AF_INET;
    addrSer.sin_port = htons(atoi(argv[2]));
    addrSer.sin_addr.s_addr = inet_addr(argv[1]);

    socklen_t len = sizeof(struct sockaddr);
   
    connect(sockCli, (struct sockaddr*)&addrSer, len);

    char buffer[256];
    while(1){
        printf("Msg:>");
        scanf("%s",buffer);
        send(sockCli, buffer, strlen(buffer)+1, 0); 
        recv(sockCli, buffer, 256, 0); 
        printf("recv msg from self :> %s\n",buffer);
    }   
    close(sockCli);

    return 0;
}

运行结果

服务器端

客户端

本例:实现了端口和地址的重用,不用再更改其中的一个来进行再次编译;

也将阻塞化为非阻塞,通过调整等待的时间;

套接字的设计用途还是很大的,可以在通信领域;

套接字是文件描述符的一种;

时间: 2024-08-03 15:43:46

套接字设置的相关文章

将套接字设置为非阻塞状态

创建一个套接字并将之设置为非阻塞模式: SOCKET s; unsigned long ul = 1; int ret; s = socket(AF_INET, SOCK_STREAM, 0); ret = ioctlsocket(s, FIONRIO, (unsigned long)&ul); if(SOCKET_ERROR==ret) { //未能将套接字设置为非阻塞模式 }

Unix网络编程 高级IO套接字设置超时

我们知道,对于一个套接字的读写(read/write)操作默认是阻塞的,如果当前套接字还不可读/写,那么这个操作会一直阻塞下去,这样对于一个需要高性能的服务器来说,是不能接受的.所以,我们可以在进行读写操作的时候可以指定超时值,这样就读写操作就不至于一直阻塞下去. 在涉及套接字的I/O操作上设置超时的方法有三种: 1:调用alarm,它在指定的超时期满时产生SIGALRM信号.这个方法涉及信号处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm调用. 2:在select中阻

python使用原始套接字 解析原始ip头数据

使用底层套接字解码底层流量,是这次做的重点工作. 首先来捕获第一个包 # coding:utf-8import socket # 监听的主机IP host = "192.168.1.100" socket_protocol = socket.IPPROTO_ICMP sniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket_protocol) sniffer.bind((host, 0)) sniffer.setso

UDP&mdash;Socket,套接字聊天简单的聊天程序。

思路:(发送端) 1.既然需要聊天.就应该怎么建立聊天程序,,DatagramSocket对象http://www.w3cschool.cc/manual/jdk1.6/ DatagramSocket dgSocket = new DatagramSocket(); 2.那么发给谁?怎么打包数据.DatagramPacket. 代码如下DatagramPacket对象API文档链接http://www.w3cschool.cc/manual/jdk1.6/ 具体查看集体代码: //创建数据包 b

Linux Socket 原始套接字编程

对于linux网络编程来说,可以简单的分为标准套接字编程和原始套接字编程,标准套接字主要就是应用层数据的传输,原始套接字则是可以获得不止是应用层的其他层不同协议的数据.与标准套接字相区别的主要是要开发之自己构建协议头.对于原始套接字编程有些细节性的东西还是需要注意的. 1. 原始套接字创建 原始套接字的编程和udp网络编程的流程有点类似,但是原始套接字编程中不需要bind操作,因为在数据接收和发送过程中使用sendto和recvfrom函数实现数据的接收和发送.不过不是说原始套接字不能使用bin

套接字描述符就绪条件

网络编程中,我们经常讨论等待某个描述符准备好I/O(读/写)或者等待其上发生一个待处理的异常条件.尽管可读性和可写性对于普通文件这样的描述符显而易见,然而对于引起诸如select返回套接字“就绪”的条件我们必须讨论的更明确些. 套接字准备好读的条件 a)该套接字接受缓冲区中的数据字节数大于等于套接字接受缓冲区低水位标记的当前大小.对这样的套接字执行读操作不会阻塞并将返回一个大于0的值(也 就是返回准备好读入的数据).我们可以使用SO_RCVLOWAT套接字选项设置该套接字的低水位标记.对于tcp

第7章套接字选项

一般通过以下函数设置套接字选项:getsockopt和setsockopt函数;fcntl函数;ioctl函数 #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); int setsockopt(int sockfd, int level, i

Linux编程---套接字

网络相关的东西几乎都是建立在套接字之上.所以这个内容对于程序员来说还是蛮重要的啊. 其实套接字也就是一个特殊的设备文件而已,我始终不能明白为什么要叫套接字.这么个奇怪的名字.不过还是就这样算了吧.关键还是编程上.由于其重要性,我还是写的详细一点吧. 一.套接字 核心函数: int  socket(int domain,int type,int protocol); 这个函数在通信域domain中创建一个类型为type,使用协议protocol的套接字.并且返回一个描述字,也就是相当于打开了一个特

Win2 Socket(套接字)相关 API

Socket(套接字) 作者信息 肖进 单位:南京中萃食品有限公司 资讯部 邮箱:[email protected] 电话:025-58642091 与socket有关的一些函数介绍 1.读取当前错误值:每次发生错误时,如果要对具体问题进行处理,那么就应该调用这个函数取得错误代码. int  WSAGetLastError(void ); #define h_errno   WSAGetLastError() 错误值请自己阅读Winsock2.h. 2.将主机的unsigned long值转换为