TCP编程:client设置超时收包时间,收包失败,关闭连接。
2017-03-09 16:10
776 查看
客户端:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#define MAXLINE 4096
int main(int argc, char** argv){
int connfd, n;
char recvline[4096], sendline[4096];
struct sockaddr_in servaddr;
if( argc != 2){
printf("usage: ./client <ipaddress>\n");
return 0;
}
if( (connfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
return 0;
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(6666);
if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
printf("inet_pton error for %s\n",argv[1]);
return 0;
}
if(connect(connfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){
printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
return 0;
}
struct timeval stTimeValStruct;
stTimeValStruct.tv_sec = 2;
stTimeValStruct.tv_usec = 0;
if(setsockopt(connfd, SOL_SOCKET, SO_SNDTIMEO , &stTimeValStruct, sizeof(stTimeValStruct))){
printf("setsockopt error: %s(errno: %d)\n", strerror(errno),errno);
return 0;
}
if(setsockopt(connfd, SOL_SOCKET, SO_RCVTIMEO , &stTimeValStruct, sizeof(stTimeValStruct))){
printf("setsockopt error: %s(errno: %d)\n", strerror(errno),errno);
return 0;
}
ssize_t writeLen;
char sendMsg[10] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '\0'};
int count = 0;
writeLen = write(connfd, sendMsg, sizeof(sendMsg));
if (writeLen < 0) {
printf("write error: %s(errno: %d)\n", strerror(errno),errno);
close(connfd);
return 0;
}
else{
printf("write sucess, writelen :%d, sendMsg:%s\n",writeLen,sendMsg);
}
char readMsg[10]={0};
int readlen= read(connfd,readMsg,sizeof(readMsg));
if (readlen < 0) {
printf("read error: %s(errno: %d)\n", strerror(errno),errno);
close(connfd);
return 0;
}
else{
readMsg[9]= '\0';
printf("read sucess, readlen :%d, readMsg:%s\n",readlen,readMsg);
}
close(connfd);
return 0;
}
服务端:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
#define MAXLINE 4096
int main(int argc, char** argv){
int listenfd, acceptfd;
struct sockaddr_in servaddr;
if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
return -1;
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(6666);
if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
return -1;
}
if( listen(listenfd, 10) == -1){
printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
return -1;
}
printf("======waiting for client's request======\n");
if( (acceptfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1){
printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
}
char recvMsg[100];
ssize_t readLen = read(acceptfd, recvMsg, sizeof(recvMsg));
if (readLen < 0) {
printf("read error: %s(errno: %d)\n",strerror(errno),errno);
return -1;
}
recvMsg[9]='\0';
printf("readLen:%d, recvMsg:%s\n" ,readLen,recvMsg);
sleep(5);
recvMsg[1]='9';
ssize_t writeLen = write(acceptfd, recvMsg, sizeof(recvMsg));
printf("writeLen:%d, sendMsg:%s\n" ,writeLen,recvMsg);
if (writeLen < 0) {
printf("writeLen error: %s(errno: %d)\n",strerror(errno),errno);
return -1;
}
close(acceptfd);
return 0;
}
相关文章推荐
- HttpClient 4.5.2版本设置连接超时时间-CloseableHttpClient设置Timeout
- HttpClient 4.5版本设置连接超时时间
- HttpClient 4.5版本设置连接超时时间
- HttpClient 4.5版本设置连接超时时间
- HttpClient设置连接超时时间
- 基于XSocket框架的socket编程技巧(设置连接的超时时间和最大空闲时间)
- Android 编程技巧-设置 ADB 连接超时时间
- HttpClient 4.5.2版本设置连接超时时间-CloseableHttpClient设置Timeout
- HttpClient 4.5版本设置连接超时时间
- 基于XSocket框架的socket编程技巧(设置连接的超时时间和最大空闲时间)
- Android 编程技巧-设置 ADB 连接超时时间
- 基于XSocket框架的socket编程技巧(设置连接的超时时间和最大空闲时间)
- 高性能网络编程4--TCP连接的关闭
- 如何设置到映射网络驱动器的超时连接时间
- php同时作为server端和client端(soapclient)的超时时间设置小结
- TCP连接的状态与关闭方式,及其对Server与Client的影响
- [转] python 远程主机强迫关闭了一个现有的连接 socket 超时设置 errno 10054
- socket连接超时的问题,设置限定时间
- 检查一个路径下文件是否存在,如果不存在设置一个定时器,在定时器内每隔一定时间检查一次,直到该文件存在返回成功,或者定时超时返回失败
- 在C#中带连接超时功能的TcpClient类(翻译自MSDN论坛CMF)