socket验证半连接的代码和测试结果

为了验证C为established状态而S为SYN_RECV状态,写了下面的源程序(在别人的基础上改的)

1. 源程序

1.1 client

#include "head.h"

int main(int argc, char **argv)
{
        struct sockaddr_in      servaddr;
        int                     status, sockfd,count;
        int fd[20];
        int index = 0;
        int flag = 1;

        count = atoi(argv[1]);
        while (count-- > 0) {
                fd[index] = socket(AF_INET, SOCK_STREAM, 0);
                sockfd = fd[index];
                index++;
                if(sockfd < 0){
                        perror("socket() error");
                        exit(1);
                }
                bzero(&servaddr, sizeof(servaddr));
                servaddr.sin_family = AF_INET;
                servaddr.sin_port = htons(SERV_PORT);
                status = inet_pton(AF_INET, "10.10.37.15", &servaddr.sin_addr);
                if(status <= 0){
                        perror("inet_pton() error");
                        exit(1);
                }

                setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(flag));
                if(connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
                        close(sockfd);
                        printf("%s......\n", strerror(errno));
                        return -1;
                } else {
                        printf("i=%d,fd:%d, ESTABLISHED.\n", index-1, sockfd);
                }

        }
        pause(); 
        return 0; 
}


 

1.2 server

#include "head.h"

int main(int argc, char **argv)
{
        int listenfd, sockfd,ret;
        struct sockaddr_in servaddr;
        char *buf = "serverritethis";
        char recv_buf[20];

        listenfd = socket(AF_INET, SOCK_STREAM, 0);
        if(listenfd < 0){
                perror("socket() error......\n");
                exit(1);
        }

        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(SERV_PORT);
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

        if(bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
                perror("bind() error......\n");
                exit(1);
        }

        if(listen(listenfd, 4) < 0){
                perror("listen() error......\n");
                exit(1);
        }

        printf("listening...\n");
        while(1){
                sleep(1);
        }

        exit(0);
}

 head.h

#ifndef __HEAD_H
#define __HEAD_H

#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <memory.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/uio.h>
#include <netinet/tcp.h>
#include <sys/wait.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/stat.h>
#include <dirent.h>
#include <signal.h>
#include <time.h>
#include <pthread.h>
#include <semaphore.h>
#include <event.h>
#include <sys/xattr.h>
#include <sys/syscall.h>
#include <sys/statvfs.h>

extern int      errno;

#define SERV_PORT 8888

#endif



 

2.测试

2.1 测试步骤

1)gcc  -o server server.c

      ./server

2) gcc -o client client.c(修改对应的server ip)

     ./client 10

2.2 测试结果

1)client

[root@bogon connect]# netstat -tanp | grep 8888
tcp        0      0 10.10.37.17:44841           10.10.37.15:8888            ESTABLISHED 18213/./syn        
tcp        0      0 10.10.37.17:44840           10.10.37.15:8888            ESTABLISHED 18213/./syn        
tcp        0      0 10.10.37.17:44842           10.10.37.15:8888            ESTABLISHED 18213/./syn        
tcp        0      0 10.10.37.17:44845           10.10.37.15:8888            ESTABLISHED 18213/./syn        
tcp        0      0 10.10.37.17:44848           10.10.37.15:8888            ESTABLISHED 18213/./syn        
tcp        0      0 10.10.37.17:44846           10.10.37.15:8888            ESTABLISHED 18213/./syn        
tcp        0      0 10.10.37.17:44839           10.10.37.15:8888            ESTABLISHED 18213/./syn        
tcp        0      0 10.10.37.17:44847           10.10.37.15:8888            ESTABLISHED 18213/./syn        
tcp        0      0 10.10.37.17:44844           10.10.37.15:8888            ESTABLISHED 18213/./syn        
tcp        0      0 10.10.37.17:44843           10.10.37.15:8888            ESTABLISHED 18213/./syn        
[root@bogon connect]#

2) server

 [root@CentOS56-64 test]# netstat -tanp | grep 8888
tcp        0      0 0.0.0.0:8888                0.0.0.0:*                   LISTEN      18383/recv         
tcp        0      0 10.10.37.15:8888            10.10.37.17:44844           SYN_RECV    -                  
tcp        0      0 10.10.37.15:8888            10.10.37.17:44846           SYN_RECV    -                  
tcp        0      0 10.10.37.15:8888            10.10.37.17:44848           SYN_RECV    -                  
tcp        0      0 10.10.37.15:8888            10.10.37.17:44845           SYN_RECV    -                  
tcp        0      0 10.10.37.15:8888            10.10.37.17:44847           SYN_RECV    -                  
tcp        0      0 10.10.37.15:8888            10.10.37.17:44840           ESTABLISHED -                  
tcp        0      0 10.10.37.15:8888            10.10.37.17:44841           ESTABLISHED -                  
tcp        0      0 10.10.37.15:8888            10.10.37.17:44842           ESTABLISHED -                  
tcp        0      0 10.10.37.15:8888            10.10.37.17:44843           ESTABLISHED -                  
tcp        0      0 10.10.37.15:8888            10.10.37.17:44839           ESTABLISHED -                  
[root@CentOS56-64 test]#

 

过了大概3分钟后:

 [root@CentOS56-64 test]# netstat -tanp | grep 8888
tcp        0      0 0.0.0.0:8888                0.0.0.0:*                   LISTEN      18383/recv          
tcp        0      0 10.10.37.15:8888            10.10.37.17:44840           ESTABLISHED -                  
tcp        0      0 10.10.37.15:8888            10.10.37.17:44841           ESTABLISHED -                  
tcp        0      0 10.10.37.15:8888            10.10.37.17:44842           ESTABLISHED -                  
tcp        0      0 10.10.37.15:8888            10.10.37.17:44843           ESTABLISHED -                  
tcp        0      0 10.10.37.15:8888            10.10.37.17:44839           ESTABLISHED -                  
[root@CentOS56-64 test]#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想在本地测试 .NET Core SSL Socket 连接,你可以使用自签名证书来进行测试。以下是一些步骤: 1. 生成自签名证书 可以使用 OpenSSL 工具生成自签名证书。在 Windows 上,你可以使用 Git Bash 或 Cygwin 中的 OpenSSL 工具。在 Linux 上,OpenSSL 工具通常已经包含在系统中。 以下是生成自签名证书的命令: ``` openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 ``` 这将生成一个有效期为 365 天的自签名证书,并将密钥和证书分别保存到 key.pem 和 cert.pem 文件中。 2. 使用自签名证书设置 .NET Core SSL Socket 下面是一个简单的 .NET Core SSL Socket 示例代码: ```csharp using System; using System.Net.Security; using System.Net.Sockets; using System.Security.Authentication; using System.Security.Cryptography.X509Certificates; using System.Text; class Program { static void Main(string[] args) { var certificate = new X509Certificate2("cert.pem"); var listener = new TcpListener(System.Net.IPAddress.Loopback, 12345); listener.Start(); while (true) { Console.WriteLine("Waiting for connection..."); using (var client = listener.AcceptTcpClient()) using (var stream = client.GetStream()) using (var ssl = new SslStream(stream)) { ssl.AuthenticateAsServer(certificate, false, SslProtocols.Tls, true); Console.WriteLine("Client connected."); var buffer = new byte[4096]; var bytesRead = ssl.Read(buffer, 0, buffer.Length); Console.WriteLine(Encoding.UTF8.GetString(buffer, 0, bytesRead)); var response = Encoding.UTF8.GetBytes("Hello, world!"); ssl.Write(response, 0, response.Length); } } } } ``` 在此示例中,我们使用 `TcpListener` 监听本地回环地址的 12345 端口,并使用 `X509Certificate2` 类加载自签名证书。然后,我们在一个无限循环中等待客户端连接,并在连接成功时使用 `SslStream` 对象进行身份验证和加密通信。 你可以使用任何支持 SSL/TLS 的客户端来测试这个示例代码。比如,你可以使用 OpenSSL 命令行工具: ``` openssl s_client -connect localhost:12345 -quiet ``` 这会连接到本地回环地址的 12345 端口,并尝试与 SSL/TLS 进行握手。如果一切正常,你将看到 "Hello, world!" 的响应。 注意:在生产环境中,你应该使用由受信任的证书颁发机构颁发的证书,而不是自签名证书。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值