- 论坛徽章:
- 0
|
原帖由 kuaizaifeng 于 2007-7-25 18:25 发表 ![]()
恩,貌似在.NET里面看到过
不过这是linux下的程序
shutdown後在close就报错了
在Linux下也是可以的,你试试下面的这个程序:
在shutdown后面再调用close(), 仍然返回成功.
server 端:
- #include<stdio.h>
- #include<sys/socket.h>
- #include<netinet/in.h>
- #include<arpa/inet.h>
- #include<netdb.h>
- #include<stdlib.h>
- #include<string.h>
- int main()
- {
- struct sockaddr_in sin;
- struct sockaddr_in pin;
- int socketfd;
- int tmpsock;
- int size;
- char buf[10000];
- int len;
- struct sockaddr_in local;
- char client[20] = {0};
- if ((socketfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
- {
- perror("socket error\n");
- exit(1);
- }
- memset(buf, 0, sizeof(buf));
- memset(&sin, 0, sizeof(sin));
- sin.sin_family = AF_INET;
- sin.sin_addr.s_addr = htonl(INADDR_ANY);
- sin.sin_port = htons(12345);
- if (bind(socketfd, (struct sockaddr*)&sin, sizeof(sin)) < 0)
- {
- perror("bind error\n");
- exit(1);
- }
- if (listen(socketfd, 20) < 0)
- {
- perror("listen error\n");
- exit(1);
- }
- printf("accept...\n");
- if ((tmpsock = accept(socketfd, (struct sockaddr*)&pin, &size)) < 0)
- {
- perror("accept error\n");
- exit(1);
- }
- if((len = read(tmpsock, buf, 10000)) > 0)
- {
- printf("buflen = %d\n", strlen(buf));
- printf("len = %d\n", len);
- }
- printf("final len = %d\n", len);
- printf("from %s, port %d\n", inet_ntop(AF_INET, &pin.sin_addr, client, sizeof(client)), ntohs(pin.sin_port));
- if (send(tmpsock, "helloworld", 11, 0) < 0)
- {
- perror("send\n");
- exit(1);
- }
- printf("send ok\n");
- if (shutdown(tmpsock, SHUT_RDWR) < 0)
- {
- perror("shutdown\n");
- exit(1);
- }
- else
- printf("shutdown ok\n");
- if (shutdown(tmpsock, SHUT_RDWR) < 0)
- {
- perror("shutdown 2 error\n");
- }
- else
- printf("shutdown 2 ok\n");
- if (close(tmpsock) < 0)
- {
- perror("close error\n");
- exit(1);
- }
- else
- printf("close ok\n");
- return 0;
- }
复制代码
client端:
- #include<stdio.h>
- #include<stdlib.h>
- #include<sys/socket.h>
- #include<netinet/in.h>
- #include<netdb.h>
- #include<arpa/inet.h>
- #include<string.h>
- #include<sys/types.h>
- #include<fcntl.h>
- #include<unistd.h>
- int main(int argc, char *argv[])
- {
- char buf[10000];
- int socketfd;
- struct sockaddr_in pin;
- struct hostent *server;
- int len;
- int fd;
- int readlen;
- if ((server = gethostbyname(argv[1])) == 0)
- {
- perror("gethostbyname error\n");
- exit(1);
- }
- memset(&pin, 0, sizeof(pin));
- pin.sin_family = AF_INET;
- pin.sin_addr.s_addr = ((struct in_addr*)(server->h_addr))->s_addr;
- pin.sin_port = htons(12345);
- memset(buf, 0, sizeof(buf));
- printf("pin.s_addr=%d\n", pin.sin_addr.s_addr);
- if ((socketfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
- {
- perror("socket error\n");
- exit(1);
- }
- if (connect(socketfd, (struct sockaddr*)&pin, sizeof(pin)) < 0)
- {
- perror("connect error\n");
- exit(1);
- }
- printf("connected...\n");
- printf("send...\n");
- if ((len = write(socketfd, "helloworld", 11)) == -1)
- {
- perror("send error\n");
- exit(1);
- }
- printf("recv\n");
- if (read(socketfd, buf, sizeof(buf)) < 0)
- {
- perror("read\n");
- exit(1);
- }
- printf("buf=%s\n", buf);
- sleep(2);
- close(socketfd);
- return 0;
- }
复制代码 |
|