以前一直覺得time_wait狀態就是主動關閉的那一方產生.而後這個端口一直不能夠用.實際我發現服務端監聽一個端口.客戶端發來鏈接後.傳輸數據後.服務端關閉客戶端套接字後.用netstat -nat | grep 端口 查看了產生了time_wait.但客戶端依然能夠不斷鏈接服務端.而後服務端不斷關閉.並不會影響監聽端口.原來是隻有服務端把監聽端口描述符給關閉(
不是accept那個鏈接.雖然,端口相同),在2mls時間內再次啓動這個端口..就會提示Address already in use
另外inet_pton(AF_INET,ip地址,&serv_addr.sin_addr);
#include "unp.h"int main(int argc,char *argv[]){ if(argc<2) { printf("please input server_ip\n"); return 0; } int fd=socket(AF_INET,SOCK_STREAM,0); if(fd<0) err_quit("socket create error"); struct sockaddr_in servaddr; struct sockaddr_in clientaddr; clientaddr.sin_family=AF_INET; clientaddr.sin_port=htonl(5900); clientaddr.sin_addr.s_addr=htons(INADDR_ANY); bind(fd,(SA*)&clientaddr,sizeof(clientaddr));` servaddr.sin_family=AF_INET;//message proctoal servaddr.sin_port=htons(13); if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr)<0) err_quit("inet_pton error"); if(connect(fd,(SA*)&servaddr,sizeof(servaddr))<0) err_quit("connect error"); char buf[1024]; int read_length=0; int count=0; while((read_length=read(fd,buf,sizeof(buf)))>0) { count++; buf[read_length]='\0'; printf("%s\n read %d ",buf,count); } printf("count=%d\n",count); if(read_length<0) err-quit("error of read");
close(fd);
return 0;
服務端
#include "unp.h"#include <time.h>int main(int argc,char *argv[]){ int listenfd=Socket(AF_INET,SOCK_STREAM,0); struct sockaddr_in servaddr; servaddr.sin_family=AF_INET; inet_pton(AF_INET,"0.0.0.0",&servaddr.sin_addr); servaddr.sin_port=htons(13); Bind(listenfd,(SA*)&servaddr,sizeof(servaddr)); Listen(listenfd,10); time_t ticks; int i; char buf[1024]; for(;;) { int client_fd=accept(listenfd,NULL,0); ticks=time(NULL); snprintf(buf,sizeof(buf),"%.24s\r\n",ctime(&ticks)); for(i=0;i<strlen(buf);++i) Write(client_fd,&buf[i],1); Close(client_fd); //Close(listenfd); } return 0;}~
1.5題 不一樣tcp對數據作不一樣的處理,每次讀取會發現count不一樣.