- 论坛徽章:
- 0
|
下面代码是局域网server同client相互发送数据代码,代码问题是为什么只能互相发送一次数据,再发送,对方就收不到了,求教!
代码如下:
/******* 服务器程序 (server.c) ************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int
main (int argc, char *argv[])
{
int sockfd, new_fd, pid, nbytes;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size, portnumber;
char buffer[1024 * 1024] = { 0 };
char hello[1024 * 1024] = { 0 };
if (argc != 2)
{
fprintf (stderr, "Usage:%s portnumber\a\n", argv[0]);
exit (1);
}
if ((portnumber = atoi (argv[1])) < 0)
{
perror ("atoi() error\n");
exit (1);
}
/* 服务器端开始建立socket描述符 */
if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
{
perror ("socket() error\n");
exit (1);
}
/* 服务器端填充 sockaddr结构 */
bzero (&server_addr, sizeof (struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl (INADDR_ANY);
server_addr.sin_port = htons (portnumber);
/* 捆绑sockfd描述符 */
if (bind
(sockfd, (struct sockaddr *) (&server_addr),
sizeof (struct sockaddr)) == -1)
{
perror ("bind() error\n");
exit (1);
}
/* 监听sockfd描述符 */
if (listen (sockfd, 5) == -1)
{
perror ("listen() error\n");
exit (1);
}
while (1)
{
/* 服务器阻塞,直到客户程序建立连接 */
sin_size = sizeof (struct sockaddr_in);
if ((new_fd =
accept (sockfd, (struct sockaddr *) (&client_addr),
&sin_size)) == -1)
{
perror ("accept() error\n");
exit (1);
}
fprintf (stderr, "Server get connection from %s\n",
inet_ntoa (client_addr.sin_addr));
if ((pid = fork ()) < 0)
{
perror ("fork() error\n");
exit (1);
}
else if (pid == 0)
{
if ((nbytes = read (new_fd, buffer, sizeof (buffer))) == -1)
{
perror ("read() error\n");
exit (1);
}
buffer[nbytes] = '\0';
fputs (buffer, stdout);
close (new_fd);
}
else
{
fgets (hello, sizeof (hello), stdin);
if (write (new_fd, hello, strlen (hello)) == -1)
{
perror ("write() error\n");
exit (1);
}
/* 这个通讯已经结束 */
close (new_fd);
}
}
close (sockfd);
exit (0);
}
=================================================================================
/******* 客户端程序 client.c ************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netdb.h>
int
main (int argc, char *argv[])
{
int sockfd, pid;
char buffer[1024 * 1024] = { 0 };
char hello[1024 * 1024] = { 0 };
struct sockaddr_in server_addr;
struct hostent *host;
int portnumber, nbytes;
if (argc != 3)
{
fprintf (stderr, "Usage:%s hostname portnumber\a\n", argv[0]);
exit (1);
}
if ((host = gethostbyname (argv[1])) == NULL)
{
perror ("gethostbyname() error\n");
exit (1);
}
if ((portnumber = atoi (argv[2])) < 0)
{
perror ("atoi() error\n");
exit (1);
}
/* 客户程序开始建立 sockfd描述符 */
if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
{
perror ("socket() error\n");
exit (1);
}
/* 客户程序填充服务端的资料 */
bzero (&server_addr, sizeof (server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons (portnumber);
server_addr.sin_addr = *((struct in_addr *) host->h_addr);
/* 客户程序发起连接请求 */
if (connect
(sockfd, (struct sockaddr *) (&server_addr),
sizeof (struct sockaddr)) < 0)
{
perror ("connect() error\n");
exit (1);
}
/* 连接成功了 */
if ((pid = fork ()) < 0)
{
perror ("fork() error\n");
}
else if (pid > 0)
{
while (1)
{
nbytes = read (sockfd, buffer, 1024);
buffer[nbytes] = '\0';
fputs (buffer, stdout);
}
}
else
{
while (1)
{
fgets (hello, sizeof (hello), stdin);
if (write (sockfd, hello, strlen (hello)) < 0)
{
perror ("write() error\n");
exit (1);
}
}
}
/* 结束通讯 */
close (sockfd);
exit (0);
} |
|