基于socket的一个小的服务器回射程序
本帖最后由 wangjc_strive 于 2013-06-03 11:32 编辑小弟最近用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;
bzero(recebuf, MAX_LINE);
again:
while((n = read(sockfd, recebuf, MAX_LINE-1)) >0)
{
//fputs(recebuf, stdout);
recebuf = '/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, &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, recvbuf;
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);
}
}
server的78行'/0'应为'\0'
页:
[1]