在centos中进行一个传输文件的客户端和服务端编写连接时一直error
来,上代码,这是服务端file_server.c的
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#define BUF 30
void error_handling(char *message);
int main(int argc,char *argv[]){
int serv_sd,clnt_sd;
FILE *fp;
char buf[BUF];
int read_cnt;
struct sockaddr_in serv_addr,clnt_addr;
socklen_t clnt_addr_size;
if(argc!=2){
printf("Usage: %s <port>\n",argv[0]);
exit(1);
}
fp = fopen("file.server.c","rb");
serv_sd=socket(PF_INET, SOCK_STREAM, 0);
if(serv_sd==-1)
error_handling("socket() error.");
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port=htons(atoi(argv[1]));
if(bind(serv_sd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1)
error_handling("bind() error.");
if(listen(serv_sd, 5)==-1)
error_handling("listen() error.");
clnt_addr_size = sizeof(clnt_addr);
clnt_sd=accept(serv_sd,(struct sockaddr*)&clnt_addr, &clnt_addr_size);
if(clnt_sd==-1)
error_handling("accept() error.");
while(1){
read_cnt=fread((void*)buf, 1, BUF, fp);
if(read_cnt < BUF){
write(clnt_sd, buf, read_cnt);
break;
}
write(clnt_sd, buf, BUF);
}
shutdown(clnt_sd, SHUT_WR);
read(clnt_sd, buf, BUF);
printf("客户端:%s\n",buf);
fclose(fp);
close(clnt_sd);close(serv_sd);
return 0;
}
void error_handling(char *message){
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}
客户端file_client.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#define BUF 30
void error_handling(char *message);
int main(int argc,char *argv[]){
int sock;
FILE *fp;
char buf[BUF];
int read_cnt;
struct sockaddr_in serv_addr;
if(argc!=3){
printf("Usage: %s <IP> <port>",argv[0]);
exit(1);
}
sock = socket(PF_INET, SOCK_STREAM,0);
if(sock==-1)
error_handling("socket() error.");
fp=fopen("file_client.c","wb");
if(fp == NULL){
printf("无法打开file_client.c");
exit(1);
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
serv_addr.sin_port = (atoi(argv[2]));
if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1)
error_handling("connect() error.");
while((read_cnt=read(sock, buf, BUF))!=0)
fwrite((void*)buf, 1, read_cnt, fp);
puts("客户端:");
write(sock, "Thank you.", 10);
fclose(fp);
close(sock);
return 0;
}
void error_handling(char *message){
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}
然后在我以centos服务器为服务端,然后win10为客户端连接时,依然是connect error,命令方面仔细检查是没有问题的。win10客户端file_client.c代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<winsock2.h>
#pragma comment(lib,"Ws2_32.lib")
#define BUF 30
void ErrorHandling(char *message);
int main(int argc,char *argv[]){
WSADATA wsaData;
SOCKET hSocket;
FILE *fp;
char buf[BUF];
int readCnt;
SOCKADDR_IN servAddr;
if(argc!=3){
printf("Usage: %s <IP> <port>",argv[0]);
exit(1);
}
if(WSAStartup(MAKEWORD(2,2), &wsaData)!=0)
ErrorHandling("WSAStartup() error.");
fp = fopen("test.dat","wb");
if(fp==NULL){
printf("无法打开test.dat文件");
exit(1);
}
hSocket = socket(PF_INET, SOCK_STREAM, 0);
if(hSocket == INVALID_SOCKET)
ErrorHandling("socket() error.");
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr(argv[1]);
servAddr.sin_port = (atoi(argv[2]));
if(connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr))==SOCKET_ERROR)
ErrorHandling("connect() error.");
while((readCnt=recv(hSocket, buf, BUF,0))!=0)
fwrite((void*)buf, 1, readCnt, fp);
puts("客户端");
send(hSocket, "Thank you.", 10, 0);
fclose(fp);
closesocket(hSocket);
WSACleanup();
return 0;
}
void ErrorHandling(char *message){
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}
依然是connect() error,另外,服务器防火墙是关闭了的。