- 论坛徽章:
- 0
|
近日编写了一个server 和client的程序,
本意是双方建立连接以后在client端发送许一行数据,server端每收到一行后显示打印一行。
并用do……while循环控制不断发送。最后输入‘c’字符结束程序,server收到‘c’字符后结束程序。
可现在,在client端能发送很多行数据,可在server端要接收玩所有的数据后等client释放连接close(sockfd);以后再一起打印,然后进入下一个循环。
如果试着在client程序中把close(sockfd);放入循环的话,程序就会出错退出。
正在寻找方法……
现把程序附上,请高手指点迷津。
/*====================================== client.c ===============================================*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netdb.h>
#define SERVPORT 3000
#define MAXDATASIZE 1024
main( int argc , char *argv[] )
{
struct hostent *host;
struct sockaddr_in serv_addr;
int sockfd,sendbytes;
int i;
char bufdata[MAXDATASIZE];
if( argc < 2)
{
fprintf(stderr, "Please enter the server's hostname!\n");
exit(1);
}
*bufdata=='1';
i=0;
if( (host = gethostbyname(argv[1])) == NULL ){
perror("gethostbyname");
exit(1);
}
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
perror("socket");
exit(1);
}else{
printf("socket success!,socket = %d\n",sockfd);
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERVPORT);
serv_addr.sin_addr = *( (struct in_addr *)host->h_addr );
bzero(&(serv_addr.sin_zero), 8);
if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1 ){
perror("connect");
exit(1);
}
printf("connect success!\n");
do
{
printf("\nPlease enter the command NO.%d:",i++);
scanf("%s",bufdata);
printf("\nThe %s must be sent.",bufdata);
if(( sendbytes = send(sockfd, bufdata ,strlen(bufdata), 0)) == -1){
perror("send");
exit(1);
}else{
printf("\nThe command NO.%d have benn sent.",i-1);
}
}while(*bufdata!='c');
printf("\nSend over!Close socket\n");
close(sockfd);
}
/*===================================== server.c =========================================*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#define SERVPORT 3000
#define BACKLOG 10
#define MAX_CONNECTED_NO 10
#define MAXDATASIZE 1024
int main()
{
struct sockaddr_in server_sockaddr,client_sockaddr;
int sin_size,recvbytes;
int sockfd,client_fd;
int i;
char bufdata[MAXDATASIZE];
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
perror("socket failed \n");
exit(1);
}
printf("socket success!,sockfd = %d\n",sockfd);
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_port = htons(SERVPORT);
server_sockaddr.sin_addr.s_addr = INADDR_ANY;
bzero(&(server_sockaddr.sin_zero), 8);
if(bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr)) == -1 ){
perror("bind failed!\n");
exit(1);
}
printf("bind success!\n");
if(listen(sockfd, BACKLOG) == -1){
perror("listen failed!\n");
exit(1);
}
printf("listening......\n");
i=0;
do
{
bufdata[0]='a';
printf("1\n");
client_fd = accept(sockfd, (struct sockaddr *)&client_sockaddr, &sin_size);
printf("client_fd=%d\n",client_fd);
if( client_fd == -1 )
{
perror("accept failed \n");
exit(1);
}else{
printf("accept success\n");
}
printf("2\n");
printf("connect from: %s,port: %d\n",inet_ntoa(client_sockaddr.sin_addr.s_addr),ntohs(client_sockaddr.sin_port));
if(( recvbytes = recv(client_fd, bufdata, MAXDATASIZE, MSG_WAITALL)) == -1)
{
perror("recv failed!\n");
exit(1);
} else{
printf("recv success\n");
}
printf("\nThe NO.%d bufdata is: ",i++) ;
puts(bufdata);
printf("\n Restart.\n");
}while(bufdata[0]!='c');
close(sockfd);
}
把源代码用附件附上,在redhat9编译通过,在高版本上也应该没有问题的。
[ 本帖最后由 hantor 于 2007-12-9 21:32 编辑 ] |
|