C语言实现的Socket编程

来源:互联网 发布:淘宝上哪家皮草店好 编辑:程序博客网 时间:2024/06/05 03:14

接收端程序:

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#define myport 319char buf[200];int main(int argc , char *argv[]){        int sockfd,new_sockfd;        struct sockaddr_in sin_addr,pin_addr;        int len, pin_addr_size,i;        if ((sockfd = socket(AF_INET, SOCK_STREAM,0)) <0)        {                printf("can’t create socket\n");                exit(1);        }        memset( &sin_addr, 0, sizeof(sin_addr));        sin_addr.sin_family = AF_INET;        sin_addr.sin_addr.s_addr = htonl(INADDR_ANY);        sin_addr.sin_port = htons(myport);        if (bind(sockfd, (struct sockaddr *)&sin_addr, sizeof(sin_addr))<0)        {                printf("can’t bind socket\n");                exit(1);        }        if (listen(sockfd, 5) < 0 )        {                printf("listen error\n");                exit(1);        }        while (1)        {                if ((new_sockfd = accept (sockfd, (struct sockaddr *)&pin_addr,&pin_addr_size)) < 0)                {                        printf("accept eroor\n");                        exit(1);                }               if(recv(new_sockfd, buf, 200, 0) == -1)                {                        printf("can’t receive packet\n");                        exit(1);                }                printf("received from client:%s\n", buf);                close(new_sockfd);        }        return 0;}


发送端程序:

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#define myport 319char buf[200]="Hello World!";int main(int argc , char *argv[]){        int sockfd,new_sockfd;        struct sockaddr_in sin_addr,pin_addr;        int len, pin_addr_size,i;        if ((sockfd = socket(AF_INET, SOCK_STREAM,0)) <0)        {                printf("can’t create socket\n");                exit(1);        }        memset( &sin_addr, 0, sizeof(sin_addr));        sin_addr.sin_family = AF_INET;        sin_addr.sin_addr.s_addr = htonl(INADDR_ANY);        sin_addr.sin_port = htons(myport);        if((new_sockfd=connect(sockfd,(struct sockaddr *)&sin_addr, sizeof(sin_addr)))!=0)        {                 printf("connect error!\n");                exit(1);        }        while(1)        {            if(send(sockfd, buf, strlen(buf), 0)<=0)            {                printf("发送失败!\n");                exit(1);            }        }        close(new_sockfd);}


此时“Hello World”只能发送一次到接收端,然后发送端终止。

如果想让服务端一直接收“Hello World”,需要把accept放在While循环外面,close放在While循环外面。此时会刷屏。

但是这样仍然有问题,此时接收端只能接收第一个建立TCP连接的发送端,即成为了点对点程序。如果想要和接收端建立多个TCP连接,就出现了问题。

所以最好的方法是在接收端建立多线程:

接收端:

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <pthread.h>#define myport 6666void *thread_function(void *arg){char buf[200];       int new_sockfd = (int)arg;        while(1){bzero(buf,200);        if(recv(new_sockfd, buf, 200, 0) == -1)        {            printf("can’t receive packet\n");            break;//以前是Exit        }        printf("received from client:%s\n", buf);        }        close(new_sockfd);}int main(int argc , char *argv[]){int sockfd;struct sockaddr_in sin_addr;        if ((sockfd = socket(AF_INET, SOCK_STREAM,0)) <0)        {                printf("can’t create socket\n");                exit(1);        }        memset( &sin_addr, 0, sizeof(sin_addr));        sin_addr.sin_family = AF_INET;        sin_addr.sin_addr.s_addr = htonl(INADDR_ANY);        sin_addr.sin_port = htons(myport);        if (bind(sockfd, (struct sockaddr *)&sin_addr, sizeof(sin_addr))<0)        {                printf("can’t bind socket\n");                exit(1);        }        if (listen(sockfd, 5) < 0 )        {                printf("listen error\n");                exit(1);        }while(1){struct sockaddr_in pin_addr;int pin_addr_size;int new_sockfd;      if ((new_sockfd = accept (sockfd, (struct sockaddr *)&pin_addr,&pin_addr_size)) < 0)        {            printf("accept eroor\n");            exit(1);        }pthread_t a_thread;//开辟线程        pthread_create(&a_thread,NULL,thread_function,(void *)new_sockfd);//创建进程}        return 0;}


发送端:

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#define myport 6666char buf[200];int main(int argc , char *argv[]){        int sockfd,new_sockfd;        struct sockaddr_in sin_addr,pin_addr;        int len, pin_addr_size,i;        if ((sockfd = socket(AF_INET, SOCK_STREAM,0)) <0)        {                printf("can’t create socket\n");                exit(1);        }        memset( &sin_addr, 0, sizeof(sin_addr));        sin_addr.sin_family = AF_INET;        sin_addr.sin_addr.s_addr = htonl(INADDR_ANY);        sin_addr.sin_port = htons(myport);        if((new_sockfd=connect(sockfd,(struct sockaddr *)&sin_addr, sizeof(sin_addr)))!=0)        {                 printf("connect error!\n");                exit(1);        }        while(1)        {scanf("%s",buf);            if(send(sockfd, buf, strlen(buf), 0)<=0)            {                printf("发送失败!\n");                exit(1);            }bzero(buf,200);        }        close(new_sockfd);}



原创粉丝点击