简单的客户端服务器通信程序

来源:互联网 发布:php 评论加回复功能 编辑:程序博客网 时间:2024/06/05 15:28
今天在linux下编写了很简单的客户端/服务器通信程序。
客户端代码如下:
/* The most simple TCP networking progrm*/
/*server.c*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>

#define MAXLINE 80
#define SERV_PORT 8000

int main(void)
{
struct sockaddr_in servaddr, cliaddr;
socklen_t cliaddr_len;
int listenfd, connfd;
char buf[MAXLINE];
char str[INET_ADDRSTRLEN];
int i,n;

listenfd = socket(AF_INET, SOCK_STREAM, 0);//对于IPV4,family 参数指定为AF_INET,对于TCP协议,type类型指定为SOCK_stream,表示面向流的传输协议。如果是UDP协议,则type参数指定为SOCK_STREAM,表示面向数据报的传输协议。protocol参数指定为0即可。

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

bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
listen(listenfd,20);

printf("Accepting connections...\n");
while(1){
    cliaddr_len=sizeof(cliaddr);
    connfd=accept(listenfd,(struct sockaddr *)&cliaddr, &cliaddr_len);
    n=read(connfd,buf,MAXLINE);
    printf("received from %s at PORT %d\n", inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)),ntohs(cliaddr.sin_port));
    for (i=0; i<n; i++)
        buf[i]=toupper(buf[i]);
    write(connfd, buf, n);
    close(connfd);
    }
}
客户端代码如下:
//client.c The function of it is to get an string from command line and send it to the server.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>

#define MAXLINE 80
#define SERV_PORT 8000

int main(int argc, char * argv[])
{
struct sockaddr_in servaddr;
char buf[MAXLINE];
int sockfd,n;
char *str;

if(argc!=2){
    fputs("usage: ./client message\n", stderr);
    exit(1);
    }
str=argv[1];

sockfd=socket(AF_INET, SOCK_STREAM, 0);

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family=AF_INET;
inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
servaddr.sin_port=htons(SERV_PORT);

connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
while(1);//使得客户端和服务器都处于链接状态
write(sockfd, str, strlen(str));

n=read(sockfd, buf, MAXLINE);
printf("Response from server:\n");
write(STDOUT_FILENO, buf, n);

close(sockfd);
return 0;

}

在没有加while(1);这句之前,客户端如下:

服务器端:

加入在客户端,connect()函数之后加入while(1)之后,在统一个终端,先打开服务器端 ./server

再打开客户端,./client

截图如下:

&加在命令后,表示将进程切换到后台去运行。用netstat -apn|grep 8000命令,可以看到它们的链接信息,如上图所示。

服务器的socket是127.0.0.1:8000,前面的是ip地址,后面的8000是端口号。

总结:关于进程的几个命令;

ctrl +z: 将当前正在运行的进程,暂停。它常与 bg连用,bg 1,将当前暂停的1进程切换到后台运行。其中1是作业号,不是进程好pid。

fg:将后台的进程调到前台,如fg 1 表示将作业号为1的进程调到前台执行。


原创粉丝点击