C中使用套接字的服务器/客户端工作流

时间:2014-05-11 17:10:25

标签: c sockets unix

我开始在大学学习unix基础知识,我有一个练习,其中包括:“在C中构建一个客户端/服务器应用程序,其中:服务器(tcp套接字)打印客户端的IP和给出的文本,并在从客户端接收“exit”作为字符串时关闭。

现在我遇到了概念上的问题,我已经写了这两个C程序(暂时忽略文本的东西......),我从两个不同的linux终端开始,但是客户端什么都不做,服务器卡住了。我不明白整个地址的事情,我应该把它放在那里(在客户端)?  长话短说:我无法建立简单的连接

服务器

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

int main (void){


    struct sockaddr_in mio_indirizzo;
    mio_indirizzo.sin_family= AF_INET;
    mio_indirizzo.sin_port=htons(5200);
    mio_indirizzo.sin_addr.s_addr  = htonl(INADDR_ANY);

    int fd = socket(PF_INET,SOCK_STREAM,0);
    if (fd<0) perror("socket"),exit(1);

    int b=bind(fd,(struct sockaddr *)&mio_indirizzo,sizeof(mio_indirizzo));
    if(b<0) perror("bind"),exit(-1);

    if((listen(fd,5))<0) perror("listen"),exit(-1);

    while(1){

             struct sockaddr indirizzo_client;
             int fd2=accept(fd, &indirizzo_client,NULL);
             if (fd2<0) perror("accept"),exit(-1);
             printf("connection accepted\n");
             close(fd2);
    }

    close(fd);
    shutdown(fd,SHUT_RDWR);
}

客户端

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

int main (void){
     int fd;
     struct sockaddr_in mio_indirizzo;

    mio_indirizzo.sin_family       = AF_INET;
    mio_indirizzo.sin_port         = htons(5200);
    inet_aton("Putted here the IP of my machine", &mio_indirizzo.sin_addr);

    fd = socket(PF_INET, SOCK_STREAM, 0); // crea un socket

    connect(fd, (struct sockaddr *) &mio_indirizzo, sizeof(mio_indirizzo)); // crea la connessione





    close(fd); // chiude il socket 

}  

1 个答案:

答案 0 :(得分:1)

在您的服务器中,对于accept():

struct sockaddr indirizzo_client;
int len = sizeof(indirizzo_client);
int fd2=accept(fd, &indirizzo_client, &len);

但实际上,您的程序只会打印&#34;连接被接受&#34;并退出。您可以使用select或threads在客户端和服务器之间进行通信。