- 论坛徽章:
- 0
|
一 个 server/client 程序 (tcp)
client 端能与 server端连接 ,而且可以互相传递消息,
问题是 server端在 接收字符串数据时,只能接收大于设定值时(红色),才能运行完成,
想问一 下各位大大,如何才能实现 任意字符串长度 的通信啊? 先谢谢了
// accept data&
bzero((void *)data2, len);
readn(client_sockfd, (void *)data2,10);
printf("Server read line:%s\n", data2);
client 源代码如下
- /* File: client.c */
- #include <sys/types.h>;
- #include <sys/socket.h>;
- #include <netinet/in.h>;
- #include <errno.h>;
- #include <stdio.h>;
- #include <errno.h>;
- int main(int argc, char **argv)
- {
- int fd;
- struct sockaddr_in address;
- int address_len;
- int rtval;
- char *data;
- static char zx[100];
- char data2[100];
- int len;
- //建立套接口
- fd = socket(AF_INET, SOCK_STREAM, 0);
- //联接
- address.sin_family = AF_INET;
- address.sin_addr.s_addr = inet_addr("127.0.0.1");
- address.sin_port = htons(1234);
- address_len = sizeof(address);
- rtval = connect(fd, (struct sockaddr *) &address, address_len);
- if (rtval == -1)
- exit(1);
- //发送数据
- printf("Client enter sth: \n");
- scanf("%s", zx);
- data = zx;
- printf("\n");
- writen(fd, (void *) data, strlen(data));
- printf("Client sent line:\n%s\n", data);
- //接收数据
- readn(fd, (void *) data2, 100);
- printf("Client read line:\n%s\n", data2);
- printf("Client exit.\n");
- //关闭
- close(fd);
- }
- // 下面是三个函数: 读n个字节; 写n个字节; 读一行.
- ssize_t readn(int fd, void *vptr, size_t n)
- {
- ssize_t nleft, nread;
- char *ptr;
- ptr = vptr;
- nleft = n;
- while (nleft >; 0) {
- if ((nread = read(fd, ptr, nleft)) < 0) {
- if (errno == EINTR)
- nread = 0;
- else
- return -1;
- } else if (nread == 0)
- break; //EOF
- nleft -= nread;
- ptr += nread;
- }
- return (n - nleft);
- }
- ssize_t writen(int fd, void *vptr, size_t n)
- {
- size_t nleft, nwritten;
- char *ptr;
- ptr = vptr;
- nleft = n;
- while (nleft >; 0) {
- if ((nwritten = write(fd, ptr, nleft)) <= 0) {
- if (errno == EINTR)
- nwritten = 0;
- else
- return -1; //error
- }
- nleft -= nwritten;
- ptr += nwritten;
- }
- return n;
- }
- ssize_t readline(int fd, void *vptr, size_t maxlen)
- {
- ssize_t n, rc;
- char c, *ptr;
- ptr = vptr;
- for (n = 1; n < maxlen; n++) {
- again:
- if ((rc = read(fd, &c, 1)) == 1) {
- *ptr++ = c;
- if (c == '\n')
- break; //readover
- } else if (rc == 0) {
- if (n == 1)
- return 0; //EOF no data read
- else
- break; //EOF some data read
- } else {
- if (errno == EINTR)
- goto again;
- return -1; //error
- }
- }
- *ptr = 0;
- return n;
- }
复制代码
server1源代码
- /* File: server1.c */
- #include <stdio.h>;
- #include <sys/types.h>;
- #include <sys/socket.h>;
- #include <netinet/in.h>;
- #include <sys/time.h>;
- #include <errno.h>;
- int main(int argc, char **argv)
- {
- int fd;
- int address_len;
- struct sockaddr_in address;
- fd_set fdset;
- // socket build
- fd = socket(AF_INET, SOCK_STREAM, 0);
- // bind
- address.sin_family = AF_INET;
- address.sin_addr.s_addr = htonl(INADDR_ANY);
- address.sin_port = htons(1234);
- address_len = sizeof(address);
- bind(fd, (struct sockaddr *) &address, address_len);
- // listen
- listen(fd, 64);
- printf("waiting...");
- while (1) {
- struct sockaddr_in client_address;
- int len;
- int client_sockfd;
- char *data;
- static char zx[100];
- char data2[100];
- struct timeval timeout;
- // set timeout
- timeout.tv_sec = 1;
- timeout.tv_usec = 0;
- // set fdset
- FD_ZERO(&fdset);
- FD_CLR(fd, &fdset);
- FD_SET(fd, &fdset);
- if ((select(fd + 1, &fdset, NULL, NULL, &timeout)) < 0) {
- printf("cannot select.\n");
- fflush(stdout);
- }
- if (FD_ISSET(fd, &fdset)) {
- //&connect?
- len = sizeof(client_address);
- client_sockfd = accept(fd,
- (struct sockaddr *)
- &client_address, &len);
- // accept data&
- bzero((void *) data2, len);
- readn(client_sockfd, (void *)data2,10); //????????问题是不是出在这句啊????????????? : (
- printf("Server read line:%s\n", data2);
- // post data
- printf("Server enter sth:\n");
- scanf("%s", zx);
- data = zx;
- printf("\n");
- writen(client_sockfd, (void *) data, strlen(data));
- printf("Server send line:%s\n", data);
- close(client_sockfd);
- printf("waiting...");
- fflush(stdout);
- } else {
- printf(".");
- fflush(stdout);
- }
- }
- }
- // 下面是三个函数: 读n个字节; 写n个字节; 读一行.
- ssize_t readn(int fd, void *vptr, size_t n)
- {
- ssize_t nleft, nread;
- char *ptr;
- ptr = vptr;
- nleft = n;
- while (nleft >; 0) {
- if ((nread = read(fd, ptr, nleft)) < 0) {
- if (errno == EINTR)
- nread = 0;
- else
- return -1;
- } else if (nread == 0)
- break; //EOF
- nleft -= nread;
- ptr += nread;
- }
- return (n - nleft);
- }
- ssize_t writen(int fd, void *vptr, size_t n)
- {
- size_t nleft, nwritten;
- char *ptr;
- ptr = vptr;
- nleft = n;
- while (nleft >; 0) {
- if ((nwritten = write(fd, ptr, nleft)) <= 0) {
- if (errno == EINTR)
- nwritten = 0;
- else
- return -1; //error
- }
- nleft -= nwritten;
- ptr += nwritten;
- }
- return n;
- }
- ssize_t readline(int fd, void *vptr, size_t maxlen)
- {
- ssize_t n, rc;
- char c, *ptr;
- ptr = vptr;
- for (n = 1; n < maxlen; n++) {
- again:
- if ((rc = read(fd, &c, 1)) == 1) {
- *ptr++ = c;
- if (c == '\n')
- break; //readover
- } else if (rc == 0) {
- if (n == 1)
- return 0; //EOF no data read
- else
- break; //EOF some data read
- } else {
- if (errno == EINTR)
- goto again;
- return -1; //error
- }
- }
- *ptr = 0;
- return n;
- }
复制代码 |
|