C Telnet我的套接字侦听端口正在关闭套接字
我是这个网站的新手,所以如果这个问题以前有人回答过,我会提前道歉,尽管我在向这里的每个人开放之前都搜索过 我正在我的一个C程序中使用套接字编程。它有服务器和客户机模块,其中服务器和客户机可以双向通信。程序运行良好,因为我能够向两个方向发送文件和消息。 我的服务器程序正在使用端口C Telnet我的套接字侦听端口正在关闭套接字,c,sockets,telnet,forceclose,C,Sockets,Telnet,Forceclose,我是这个网站的新手,所以如果这个问题以前有人回答过,我会提前道歉,尽管我在向这里的每个人开放之前都搜索过 我正在我的一个C程序中使用套接字编程。它有服务器和客户机模块,其中服务器和客户机可以双向通信。程序运行良好,因为我能够向两个方向发送文件和消息。 我的服务器程序正在使用端口3873,我已经通过netstat-anp | grep3873 我观察到socket有一种奇怪的行为,特别是当我尝试使用浏览器连接socket时,比如http://localhost:3873或telnet localh
3873
,我已经通过netstat-anp | grep3873
我观察到socket有一种奇怪的行为,特别是当我尝试使用浏览器连接socket时,比如http://localhost:3873
或telnet localhost 3873
。它立即关闭套接字,随后的“netstat-anp | grep3873”输出确认localhost不再侦听端口3873
如果有人能告诉我这种行为,我将不胜感激。这是预期行为吗
下面是服务器代码的相关部分:主程序启动一个专用线程并调用startFileServerMT,随后调用handleClient为连接到套接字上的服务器的每个客户端提供服务
int handleClient(void *ptr){
DEBUG("Inside the %s %s() \n",__FILE__,__func__);
int connectSOCKET;
connectSOCKET = (int ) ptr;
char recvBUFF[4096],sendBUFF[4096];
char *filename;
FILE * recvFILE;
char *header[4096];
while(1){
if( recv(connectSOCKET, recvBUFF, sizeof(recvBUFF), 0) > 0){
if(!strncmp(recvBUFF,"FBEGIN",6)) {
recvBUFF[strlen(recvBUFF) - 2] = 0;
parseArgs(header,recvBUFF);
filename = (char*) strngDup(header[1]);
DEBUG(" About to receive file: %s\n", filename);
}
char *rfile = ALLOC(sizeof(char) * (strlen(This.uploadDIR) + strlen(filename) + 35));
strcpy(rfile,This.uploadDIR);
if (strngLastChar(rfile) == '/'){
strcat(rfile,filename);
}else{
strcat(rfile,"/");
strcat(rfile,filename);
}
DEBUG(" Absolute file is : %s\n", rfile);
recvBUFF[0] = 0;
if ((recvFILE = fopen (rfile,"w" )) == NULL){
LogError("Server could not create file %s on the shared location %s.\n",filename,This.uploadDIR);
}else{
bzero(recvBUFF,4096);
int fr_block_sz, write_sz;
while((fr_block_sz = recv(connectSOCKET, recvBUFF, 512, 0)) > 0 ){
write_sz = fwrite (recvBUFF , sizeof(recvBUFF[0]) , fr_block_sz , recvFILE );
DEBUG(" Received buffer is : %s\n", recvBUFF);
if(write_sz < fr_block_sz){
LogError("Failed writing file %s on the Server shared location.\n",filename);
break;
}
bzero(recvBUFF,4096);
recvBUFF[0] = 0;
if(write_sz == 0 || fr_block_sz != 512 ){
break;
}
}
if(fr_block_sz < 0){
if(errno == EAGAIN){
LogError("Server collection file %s receive timed out.\n",filename);
}else{
LogError("Failed file %s transfer due to error %d\n",filename,errno);
fclose(recvFILE);
FREE(rfile);
// Start - Following code send failed status to client
sprintf(sendBUFF,"FSTATUS:FAILED\r\n");
if (send(connectSOCKET, sendBUFF, sizeof(sendBUFF), 0) >= 0){
DEBUG("File transfer status for file %s sent\n",filename);
}else{
DEBUG("Failed sending transfer status for file %s\n",filename);
return FALSE;
}
// End
close(connectSOCKET);
return FALSE;
}
}
DEBUG("File %s received on OM Server successfully.\n",filename);
// Start - Following code send failed status to client
sprintf(sendBUFF,"FSTATUS:SUCCESS\r\n");
if (send(connectSOCKET, sendBUFF, sizeof(sendBUFF), 0) >= 0){
DEBUG("File transfer status for file %s sent\n",filename);
}else{
DEBUG("Failed sending transfer status for file %s\n",filename);
return FALSE;
}
// End
fclose(recvFILE);
updateTargets(rfile);
FREE(rfile);
close(connectSOCKET);
break;
}
}
else {
LogInfo("Client dropped connection\n");
}
/** End*/
return TRUE;
}
}
int startFileServerMT(){
DEBUG("Inside %s %s() \n",__FILE__,__func__);
int listenSOCKET, connectSOCKET[512],thread_status;
int socketINDEX = 0;
pthread_t clientFileThread[512];
socklen_t clientADDRESSLENGTH[512];
struct sockaddr_in clientADDRESS[512], serverADDRESS;
if((listenSOCKET = socket(AF_INET, SOCK_STREAM, 0)) < 0 ){
LogAbortError("File server could not create socket.\n");
close(listenSOCKET);
return FALSE;
}
serverADDRESS.sin_family = AF_INET;
serverADDRESS.sin_addr.s_addr = htonl(INADDR_ANY);
serverADDRESS.sin_port = htons(This.serverport);
if (bind(listenSOCKET, (struct sockaddr *) &serverADDRESS, sizeof(serverADDRESS)) < 0) {
LogAbortError("File server could not bind socket and will stop server now.\n");
close(listenSOCKET);
This.stopped = TRUE;
return FALSE;
}
if(listen(listenSOCKET, 5) == -1){
LogAbortError("Server failed to listen on port %d and will stop server now.\n",This.serverport);
close(listenSOCKET);
This.stopped = TRUE;
return FALSE;
}else{
LogInfo("Server listening on port %d successfully.\n",This.serverport);
}
clientADDRESSLENGTH[socketINDEX] = sizeof(clientADDRESS[socketINDEX]);
while(TRUE){
// DEBUG(" Inside the file server main loop index[%d].\n",socketINDEX);
connectSOCKET[socketINDEX] = accept(listenSOCKET, (struct sockaddr *) &clientADDRESS[socketINDEX], &clientADDRESSLENGTH[socketINDEX]);
if(connectSOCKET[socketINDEX] < 0){
LogError("Server could not accept connection.\n");
close(listenSOCKET);
return FALSE;
}else
DEBUG(" Another client connected to server socket.\n");
ThreadCreateDetached( &clientFileThread[socketINDEX], handleClient, connectSOCKET[socketINDEX]);
if(socketINDEX=512) {
socketINDEX = 0;
} else {
socketINDEX++;
}
if (This.stopped == TRUE){
close(listenSOCKET);
return TRUE;
}
/** End*/
// return TRUE;
}
close(listenSOCKET);
return TRUE;
}
int-handleClient(void*ptr){
调试(“在%s%s()\n内,_文件,_函数,_);
int连接插座;
connectSOCKET=(int)ptr;
char recvBUFF[4096],sendBUFF[4096];
字符*文件名;
文件*recvFILE;
字符*头[4096];
而(1){
如果(recv(connectSOCKET,recvBUFF,sizeof(recvBUFF),0)>0){
如果(!strncmp(recvBUFF,“FBEGIN”,6)){
recvBUFF[strlen(recvBUFF)-2]=0;
parseArgs(头,recvBUFF);
filename=(char*)strngDup(头[1]);
调试(“即将接收文件:%s\n”,文件名);
}
char*rfile=ALLOC(sizeof(char)*(strlen(This.uploadDIR)+strlen(filename)+35));
strcpy(rfile,This.uploadDIR);
if(strngLastChar(rfile)=='/')){
strcat(rfile,文件名);
}否则{
strcat(rfile,“/”);
strcat(rfile,文件名);
}
调试(“绝对文件为:%s\n”,rfile);
recvBUFF[0]=0;
if((recvFILE=fopen(rfile,“w”))==NULL){
日志错误(“服务器无法在共享位置%s上创建文件%s。\n”,文件名,This.uploadDIR);
}否则{
bzero(recvBUFF,4096);
int fr_block_sz,write_sz;
而((fr_block_sz=recv(connectSOCKET,recvBUFF,512,0))>0){
write_sz=fwrite(recvBUFF,sizeof(recvBUFF[0]),fr_block_sz,recvFILE);
调试(“收到的缓冲区为:%s\n”,recvBUFF);
if(写入_sz=0){
调试(“已发送文件%s的文件传输状态,\n”,文件名);
}否则{
调试(“发送文件%s的传输状态失败,\n”,文件名);
返回FALSE;
}
//结束
关闭(连接插座);
返回FALSE;
}
}
调试(“在OM服务器上成功接收到文件%s。\n”,文件名);
//开始-以下代码向客户端发送失败状态
sprintf(sendBUFF,“FSTATUS:SUCCESS\r\n”);
if(send(connectSOCKET,sendBUFF,sizeof(sendBUFF),0)>=0){
调试(“已发送文件%s的文件传输状态,\n”,文件名);
}否则{
调试(“发送文件%s的传输状态失败,\n”,文件名);
返回FALSE;
}
//结束
fclose(recvFILE);
updateTargets(rfile);
免费(rfile);
关闭(连接插座);
打破
}
}
否则{
LogInfo(“客户端断开连接”);
}
/**完*/
返回TRUE;
}
}
int startFileServerMT(){
调试(“在%s%s()\n内,_文件,_函数,_);
int listenSOCKET,connectSOCKET[512],线程状态;
int socketINDEX=0;
pthread_t clientFileThread[512];
socklen_t clientADDRESSLENGTH[512];
clientADDRESS[512]中的结构sockaddr_,serverADDRESS;
if((listenSOCKET=socket(AF_INET,SOCK_STREAM,0))<0){
LogaborError(“文件服务器无法创建套接字。\n”);
关闭(listenSOCKET);
返回FALSE;
}
serverADDRESS.sin_family=AF_INET;
serverADDRESS.sin\u addr.s\u addr=htonl(INADDR\u ANY);
serverADDRESS.sin_port=htons(This.serverport);
if(bind(listenSOCKET,(struct sockaddr*)&服务器地址
if(socketINDEX=512) { // Error: you are *setting* socketINDEX to 512,
// then immediately *resetting* it back to 0. So
// every new connection overrides the existing
// socket.
socketINDEX = 0;
} else {
socketINDEX++;
}