Sodalucky 2016-06-01 03:03 采纳率: 0%
浏览 1989

基于tcp的客户端与客户端通信

刚学习的菜鸟,linux下c编写的网络通信,客户端a先给服务端发送数据,服务端接收到数据,再将接收的数据转给客户端b,现在客户端a能发给服务端,可是客户端b接不到。希望大神能帮忙解决一下。

服务器
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <strings.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>

#define PORT 5889
#define MAXSIZE 1024


int main(int argc,char *argv[])
{
    int sockfd;
    struct sockaddr_in server_addr;
    int sin_size,newfd;
    struct sockaddr_in client_addr;
    char buf[MAXSIZE];
    if(argc!=2)
    {
        fprintf(stderr,"Usage:%s hostname port\a\n",argv[0]);
        return 1;       
    }
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd==-1)
    {
        fprintf(stderr,"Socket Error: %d\a\n",strerror(errno));
        return 1;       
    }   
    memset(&server_addr,0,sizeof(struct sockaddr_in));
    server_addr.sin_family=AF_INET;
    server_addr.sin_port=htons(PORT);
    server_addr.sin_addr.s_addr=htonl(INADDR_ANY);

    if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
    {
        fprintf(stderr,"Bind Error: %d\a\n",strerror(errno));
        return 1;   
    }

    if(listen(sockfd,20))
    {
        fprintf(stderr,"Listen Error: %d\a\n",strerror(errno));
        return 1;   
    }



    while(1)
    {       

        errno = 0;
        sin_size=sizeof(struct sockaddr_in);
        newfd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size);
        if(newfd==-1)
        {
            fprintf(stderr,"Accept Error: %d\a\n",strerror(errno));
            continue;   
        }
        fprintf(stderr,"Server get connection from %s\n",inet_ntoa(client_addr.sin_addr));


        if(fork()==0)
        {   
            memset(buf,0,sizeof(buf));

            if(read(newfd,buf,sizeof(buf))<1)
            {
                fprintf(stderr,"Read Error: %d\a\n",strerror(errno));
                return 1;   
            }   

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

            memset(buf,0,sizeof(buf));      
            fgets(buf,sizeof(buf),stdin);
            if(write(newfd,buf,strlen(buf)+1)==-1)
            {
                fprintf(stderr,"Write Error: %d\n",strerror(errno));    
                return 1;   
            }
            close(newfd);
        }
        newfd=-1;

    }
    close(sockfd);
    return 0;
}

客户端a

 #include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <strings.h>
#include <netdb.h>
#include <unistd.h>


#define PORT 5889

int main(int argc,char *argv[])
{
    int sockfd;
    struct sockaddr_in server_addr;
    struct hostent *host;
    int nbytes;
    char buffer[1024];

    if(argc!=3)
    {
        fprintf(stderr,"Usage:%s hostname port\a\n",argv[0]);
        return 1;       
    }
    if((host=gethostbyname(argv[1]))==NULL)
    {
        fprintf(stderr,"Gethostname error\n");
        return 1;       
    }

     sockfd=socket(AF_INET,SOCK_STREAM,0);

    if(sockfd==-1)
    {
        fprintf(stderr,"Socket Error: %d\a\n",strerror(errno));
        return 1;       
    }   
    memset(&server_addr,0,sizeof(server_addr));
    server_addr.sin_family =AF_INET;
    server_addr.sin_port = htons(PORT);
    server_addr.sin_addr = *((struct in_addr *)host->h_addr);


    if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
    {
        fprintf(stderr,"Connect Error:%d\a\n",strerror(errno)); 
        return 1;       
    }

    while(1)
    {
        memset(buffer,0,sizeof(buffer));
        fgets(buffer,sizeof(buffer),stdin);
        if(write(sockfd,buffer,strlen(buffer)+1)==-1)
        {
            fprintf(stderr,"Write Error: %d\n",strerror(errno));    
            return 1;   
        }

        memset(buffer,0,sizeof(buffer));

            if(read(sockfd,buffer,sizeof(buffer))<1)
            {
                fprintf(stderr,"Read Error: %d\a\n",strerror(errno));
                return 1;   
            }   

            printf ("I have received:%s\n",buffer);

    }

    close(sockfd);
    return 0;
}

客户端b

#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <strings.h>
#include <netdb.h>
#include <unistd.h>


#define PORT 5889

int main(int argc,char *argv[])
{
    int sockfd,portnumber;
    struct sockaddr_in server_addr;
    struct hostent *host;
    int nbytes;
    char buffer[1024];

    if(argc!=3)
    {
        fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);
        return 1;       
    }
    if((host=gethostbyname(argv[1]))==NULL)
    {
        fprintf(stderr,"Gethostname error\n");
        return 1;       
    }

    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
    {
        fprintf(stderr,"Socket Error: %d\a\n",strerror(errno));
        return 1;       
    }   
    memset(&server_addr,0,sizeof(server_addr));
    server_addr.sin_family =AF_INET;
    server_addr.sin_port = htons(PORT);
    server_addr.sin_addr = *((struct in_addr *)host->h_addr);
    if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
    {
        fprintf(stderr,"Connect Error:%d\a\n",strerror(errno)); 
        return 1;       
    }

    while(1)
    {
        memset(buffer,0,sizeof(buffer));
        nbytes=read(sockfd,buffer,sizeof(buffer));
        if(nbytes<1)
        {
            fprintf(stderr,"Read Error:%d\a\n",strerror(errno));    
            return 1;       
        }

        printf("I have received:%s\n",buffer);

        memset(buffer,0,sizeof(buffer));
        fgets(buffer,sizeof(buffer),stdin);
        if(write(sockfd,buffer,strlen(buffer)+1)==-1)
        {
            fprintf(stderr,"Write Error: %d\n",strerror(errno));    
            return 1;   
        }

    }

    close(sockfd);
    return 0;
}
  • 写回答

1条回答 默认 最新

  • 普通网友 2016-10-07 16:36
    关注

    cp的客户端与客户端通信
    刚学习的菜鸟,linux下c编写的网络通信,客户端a先给服务端发送数据,服务端接收到数据,再将接收的数据转给客户端b,现在客户端a能发给服务端,可是客户端b接不到。希望大神能帮忙解决一下。
    服务器
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    #define PORT 5889
    #define MAXSIZE 1024

    int main(int argc,char *argv[])
    {
    int sockfd;
    struct sockaddr_in server_addr;
    int sin_size,newfd;
    struct sockaddr_in client_addr;
    char buf[MAXSIZE];
    if(argc!=2)
    {
    fprintf(stderr,"Usage:%s hostname port\a\n",argv[0]);
    return 1;

    }
    sockfd=socket(AF_INET,SOCK_STREAM,0);

    评论

报告相同问题?

悬赏问题

  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
  • ¥50 400g qsfp 光模块iphy方案
  • ¥15 两块ADC0804用proteus仿真时,出现异常