您的位置:首页 > 理论基础 > 计算机网络

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: