- 论坛徽章:
- 1
|
小弟最近用socket写了一个c/s的小程序,客户端发一段字符给服务器,服务器收到该段字符后,将其再发回给客户端,我二者链接建立好后,我用客户端发字符的时候,服务器端总是会收到额外的字符,下面是问题的截图,以及我的代码,希望哪位高手给点指点,我知道应该是read跟write的地方有问题。
首先server端监听到了client端的链接,打印now receive a new connect!! 然后我在client端输入first line input,为什么server却收到了“first line input”,后面还跟了个“0”
- #include"unp.h"
- //server
- /*
- #include<sys/socket.h>//socket()
- #include<netinet/in.h>//sockaddr_in
- #include<stdio.h>//perror()
- #include<unistd.h>//fork()
- #include<stdlib.h>
- #include<errno.h>//errno, EINTR
- #include<string.h>//strlen()
- #define PORT 7788
- #define MAX_BUF 1000
- */
- void server_read(int sockfd);
- int main(int argc, char *argv[])
- {
- int listenfd, connfd;
- struct sockaddr_in cliaddr, servaddr;
- pid_t childpid;
- socklen_t clilen;
- if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- {
- perror("socket error");
- }
- bzero(&servaddr, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- servaddr.sin_port = htons(PORT);
- if( bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
- {
- perror("bind error");
- exit(EXIT_FAILURE);
- }
- printf("bind OK\n");
- if( listen(listenfd, 5) == -1)
- {
- perror("listen error");
- }
- printf("now listening \n");
- for(;;)
- {
- clilen = sizeof(cliaddr);
- connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen);
- if(connfd == -1)
- {
- perror("accept error");
- }
- printf("now receive a new connect!!\n");
- if( (childpid = fork()) == -1 )
- {
- perror("fork error");
- }
- else if(childpid == 0)//child
- {
- close(listenfd);
- server_read(connfd);
- exit(0);
- }
- }
- close(connfd);
- }
- void
- server_read(int sockfd)
- {
- unsigned int n;
- char recebuf[MAX_LINE];
-
- bzero(recebuf, MAX_LINE);
- again:
- while((n = read(sockfd, recebuf, MAX_LINE-1)) >0)
- {
- //fputs(recebuf, stdout);
- recebuf[n] = '/0';
- printf("server receive: %s\n",recebuf);
- write(sockfd, recebuf, strlen(recebuf));
- printf("server write: %s\n", recebuf);
- }
- if(n<0 && errno == EINTR)
- {
- goto again;
- }
- else if(n<0)
- {
- perror("read or write error");
- }
- }
复制代码- #include"unp.h"
- //client
- /*
- #include<sys/socket.h>//socket() bind()...
- #include<stdio.h>//perror
- #include<arpa/inet.h>//inet_pton()
- #include<string.h>//bzero()
- #include<stdlib.h>//exit()
- #define port 7788
- #define MAX_LINE 1000
- */
- void client_read(FILE *fp, int sockfd);
- int
- main(int argc, char **argv)
- {
- int sockfd;
- char *str;
- struct sockaddr_in cliaddr;
- if(argc != 2)
- {
- printf("input right canshu");
- exit(1);
- }
- if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- {
- perror("socket error");
- }
- bzero(&cliaddr, sizeof(cliaddr));
- cliaddr.sin_family = AF_INET;
- cliaddr.sin_port = htons(port);
- if( inet_pton(AF_INET, argv[1], &cliaddr.sin_addr) !=1 )
- {
- printf("inet_pton error");
- }
- if((connect(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr))) == -1)
- {
- perror("connect error!!!");
- exit(0);
- }
- client_read(stdin, sockfd);
- }
- void
- client_read(FILE *fp, int sockfd)
- {
- char writebuf[MAX_LINE], recvbuf[MAX_LINE];
-
- bzero(writebuf, MAX_LINE);
- bzero(recvbuf, MAX_LINE);
- while( (fgets(writebuf, MAX_LINE, fp)) != NULL )
- {
-
- printf("your input is: %s\n", writebuf);
- write(sockfd, writebuf, strlen(writebuf));
- printf("client write: %s\n",writebuf);
- if((read(sockfd, recvbuf, MAX_LINE)) ==0 )
- {
- printf("read zero\n");
- }
- //fputs(recvbuf, stdout);
- printf("client receive: %s\n", recvbuf);
- }
- }
复制代码 |
|