试手的两个TCP/IP连接对话脚本

举报
沧浪之水 发表于 2020/08/18 20:44:58 2020/08/18
【摘要】 网间进程通信要解决的是不同主机进程间的相互通信问题(可把同机进程通信看作是其中的特例)。为此,首先要解决的是网间进程标识问题。同一主机上,不同进程可用进程号(process ID)唯一标识。但在网络环境下,各主机独立分配的进程号不能唯一标识该进程。其次,操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不同。因此,网间进程通信还要解决多重协议的识别问题.

脚本1:

//server.c

#include<stdio.h>   

#include<stdlib.h>   

#include<string.h>   

#include<errno.h>

#include<sys/types.h>

#include<sys/socket.h>   

#include<netinet/in.h>   

#define DEFAULT_PORT 8000   

#define MAXLINE 4096

#define SELF_ADDR  

int main(int argc, char** argv)

{

    int socket_fd, connect_fd;

struct sockaddr_in  servaddr;

char buff[4096];

int n;

//init socket

socket_fd = socket(AF_INET, SOCK_STEAM, 0);

if(socket_fd == -1){

        printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);

        exit(0);

}

//初始化

    memset(&servaddr, 0, sizeof(servaddr));  

    servaddr.sin_family = AF_INET;  

    servaddr.sin_addr.s_addr = htonl(SELF_ADDR);//IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。   

    servaddr.sin_port = htons(DEFAULT_PORT);//设置的端口为DEFAULT_PORT

//init bind

int bind_fd = bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr));

if(bind_fd == -1){

    printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);

exit(0);

}

//开始监听是否有客户端连接   

    if( listen(socket_fd, 10) == -1){  

printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);  

exit(0);  

}  

printf("======waiting for client's request======\n");  

while(1){  

//阻塞直到有客户端连接,不然多浪费CPU资源。   

if( (connect_fd = accept(socket_fd, (struct sockaddr*)NULL, NULL)) == -1){  

printf("accept socket error: %s(errno: %d)",strerror(errno),errno);  

continue;  

}  

//接受客户端传过来的数据   

n = recv(connect_fd, buff, MAXLINE, 0);  

//向客户端发送回应数据   

if(!fork()){ /*紫禁城*/  

if(send(connect_fd, "Hello,you are connected!\n", 26,0) == -1)  

perror("send error");  

close(connect_fd);  

exit(0);  

}  

buff[n] = '\0';  

printf("recv msg from client: %s\n", buff);  

close(connect_fd);  

}  

close(socket_fd);  


}

//client.c

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<errno.h>

#include<sys/types.h>

#include<sys/socket.h>

#include<netinet/in.h> 

#define MAXLINE 4096  

int main(int argc, char** argv)

{

int    sockfd, n,rec_len;

    char    recvline[4096], sendline[4096];

    char    buf[MAXLINE];    struct sockaddr_in    servaddr;

    if( argc != 2){

    printf("usage: ./client <ipaddress>\n");

    exit(0);

}

sockfd = socket(AF_INET, SOCK_STREAM, 0);

if(sockfd < 0){

    printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);

    exit(0);    

}

memset(&servaddr, 0, sizeof(servaddr));    

servaddr.sin_family = AF_INET;    

servaddr.sin_port = htons(8000);    

if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){

    printf("inet_pton error for %s\n",argv[1]);

    exit(0);

}

if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){

    printf("connect error: %s(errno: %d)\n",strerror(errno),errno);

    exit(0);

}      

printf("send msg to server: \n");

fgets(sendline, 4096, stdin);    

if( send(sockfd, sendline, strlen(sendline), 0) < 0){

    printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);

    exit(0);

}

if((rec_len = recv(sockfd, buf, MAXLINE,0)) == -1) {

        perror("recv error");

        exit(1);

    }

    buf[rec_len]  = '\0';

    printf("Received : %s ",buf);

    close(sockfd); 

    exit(0);

 }


脚本2:

//server.c

#include <stdio.h>  

#include <sys/types.h>  

#include <sys/socket.h>  

#include <netinet/in.h>  

#include <arpa/inet.h>  

  

int main(int argc, char *argv[])  

{  

    int server_sockfd;//服务器端套接字  

    int client_sockfd;//客户端套接字  

    int len;  

    struct sockaddr_in my_addr;   //服务器网络地址结构体  

    struct sockaddr_in remote_addr; //客户端网络地址结构体  

    int sin_size;  

    char buf[BUFSIZ];  //数据传送的缓冲区  

    memset(&my_addr,0,sizeof(my_addr)); //数据初始化--清零  

    my_addr.sin_family=AF_INET; //设置为IP通信  

    my_addr.sin_addr.s_addr=INADDR_ANY;//服务器IP地址--允许连接到所有本地地址上  

    my_addr.sin_port=htons(8000); //服务器端口号  

      

    /*创建服务器端套接字--IPv4协议,面向连接通信,TCP协议*/  

    if((server_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)  

    {    

        perror("socket");  

        return 1;  

    }  

   

        /*将套接字绑定到服务器的网络地址上*/  

    if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)  

    {  

        perror("bind");  

        return 1;  

    }  

      

    /*监听连接请求--监听队列长度为5*/  

    listen(server_sockfd,5);  

      

    sin_size=sizeof(struct sockaddr_in);  

      

    /*等待客户端连接请求到达*/  

    if ((client_sockfd=accept(server_sockfd,(struct sockaddr *)&remote_addr,&sin_size))<0)  

    {  

        perror("accept");  

        return 1;  

    }  

    printf("accept client %s\n",inet_ntoa(remote_addr.sin_addr));  

    len=send(client_sockfd,"Welcome to my server\n",21,0);//发送欢迎信息  

      

    /*接收客户端的数据并将其发送给客户端--recv返回接收到的字节数,send返回发送的字节数*/  

    while((len=recv(client_sockfd,buf,BUFSIZ,0))>0))  

    {  

        buf[len]='\0';  

        printf("%s\n",buf);  

        if(send(client_sockfd,buf,len,0)<0)  

        {  

            perror("write");  

            return 1;  

        }  

    }  

    close(client_sockfd);  

    close(server_sockfd);  

    return 0;  

}  

//client.c

#include <stdio.h>  

#include <sys/types.h>  

#include <sys/socket.h>  

#include <netinet/in.h>  

#include <arpa/inet.h>  

 

int main(int argc, char *argv[])  

{  

    int client_sockfd;  

    int len;  

    struct sockaddr_in remote_addr; //服务器端网络地址结构体  

    char buf[BUFSIZ];  //数据传送的缓冲区  

    memset(&remote_addr,0,sizeof(remote_addr)); //数据初始化--清零  

    remote_addr.sin_family=AF_INET; //设置为IP通信  

    remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");//服务器IP地址  

    remote_addr.sin_port=htons(8000); //服务器端口号  

      

    /*创建客户端套接字--IPv4协议,面向连接通信,TCP协议*/  

    if((client_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)  

    {  

        perror("socket");  

        return 1;  

    }  

      

    /*将套接字绑定到服务器的网络地址上*/  

    if(connect(client_sockfd,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr))<0)  

    {  

        perror("connect");  

        return 1;  

    }  

    printf("connected to server\n");  

    len=recv(client_sockfd,buf,BUFSIZ,0);//接收服务器端信息  

         buf[len]='\0';  

    printf("%s",buf); //打印服务器端信息  

      

    /*循环的发送接收信息并打印接收信息--recv返回接收到的字节数,send返回发送的字节数*/  

    while(1)  

    {  

        printf("Enter string to send:");  

        scanf("%s",buf);  

        if(!strcmp(buf,"quit")) 

            break;  

        len=send(client_sockfd,buf,strlen(buf),0);  

        len=recv(client_sockfd,buf,BUFSIZ,0);  

        buf[len]='\0';  

        printf("received:%s\n",buf);  

    }  

    close(client_sockfd);//关闭套接字  

    return 0;  

}  


【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。