在编写一个服务器和客户端程序时,在不同的机器上连接会提示10061错误,但是在同一个机器通过回环连接却不报错。
服务器代码:
#include"../TcpSocket/tcpSocket.h"
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define BUF 1020000
int main(void) {
init_Socket();
SOCKET serfd = createServerSocket(NULL);
FILE*fp, *fp1;
long int j = 0, b;
wait:
puts("wait for client");
SOCKET clifd = accept(serfd, NULL, NULL);
char acc_buffer[1024] = { 0 }, sysmes[BUF];
if (INVALID_SOCKET == clifd)
err("accept");
puts("connected");
//通信
for (;;) {
for (int i = 0; i < 1024; acc_buffer[i] = '\0', i++);
for (long int i = 0; i < BUF; sysmes[i] = '\0', i++);
if (0 < recv(clifd, acc_buffer, 1024, 0)) {
if (!strcmp("\\exit", acc_buffer)) {
puts("disconnected");
goto wait;
}
else if (!strcmp("\\fcreate",acc_buffer)) {
if (SOCKET_ERROR == send(clifd, "pls enter the name:", strlen("pls enter the name:"), 0)) {
err("send");
break;
}
for (int i = 0; i < 1024; acc_buffer[i] = '\0', i++);
if (0 < recv(clifd, acc_buffer, 1024, 0)) {
if (!(fp1 = fopen(acc_buffer, "w+"))) {
if (SOCKET_ERROR == send(clifd, "cannot create it", strlen("cannot create it"), 0)) {
err("send");
break;
}
continue;
}
}
if (SOCKET_ERROR == send(clifd, "successfully,pls enter the text\n", strlen("successfully,pls enter the text\n"), 0)) {
err("send");
break;
}
for (int i = 0; i < 1024; acc_buffer[i] = '\0', i++);
if ((0 < recv(clifd, acc_buffer, 1024, 0))&& fputs(acc_buffer, fp1)!=EOF) {
if (SOCKET_ERROR == send(clifd, "successfully\n", strlen("successfully\n"), 0)) {
err("send");
break;
}
}
fclose(fp1);
continue;
}
printf("receive:%s\n", acc_buffer);
//执行指令
sprintf(sysmes, "%s > bin.log 2>&1", acc_buffer);
system(sysmes);
fp = fopen("bin.log", "a+");
if (!fp||fseek(fp, 0L, SEEK_SET)) {
fprintf(stderr, "cannot open file bin.log");
return -1;
}
sprintf(sysmes, "------the server answer-------\n");
for (j = strlen("------the server answer-------\n"); j < BUF&&(b=getc(fp))!=EOF;sysmes[j]=b,j++);
sysmes[j] = '\0';
if (SOCKET_ERROR == send(clifd, sysmes, strlen(sysmes), 0)) {
err("send");
break;
}
fclose(fp);
remove("bin.log");
}
}
//关闭
closesocket(clifd);
closesocket(serfd);
close_Socket();
puts("hit the enter key to exit");
getchar();
return 0;
}
客户端代码:
#include"../TcpSocket/tcpSocket.h"
#include<stdio.h>
#include<string.h>
#define BUF 1020000
int main(void) {
init_Socket();
char a[] = "127.0.0.1";
puts("pls input the server's IP");
scanf("%s", a);
getchar();
puts("connecting");
SOCKET clifd = createClientSocket("127.0.0.1");
char buffer[1024], receive[BUF];
//send message
for (;;) {
input:
for (int i = 0; i < 1024; buffer[i] = '\0', i++);
for (int i = 0; i < BUF; receive[i] = '\0', i++);
fputs("pls send message(\\exit to exit,\\fcreate to create file on server,enter to skip the input):", stdout);
for (int a = 0, b = 0; (a = getchar()) != '\n'&&b < 1024; buffer[b]=a, b++);
if (buffer[0] == '\0')
goto input;
if (!strcmp(buffer, "\\exit")) {
if (SOCKET_ERROR == send(clifd,"\\exit", strlen("\\exit"), 0))
err("exit");
break;
}
if (SOCKET_ERROR == send(clifd, buffer, strlen(buffer), 0))
err("send");
receiv:
if (0 < recv(clifd,receive, BUF, 0)) {
if (!strcmp(receive, "pls enter the name:")) {
puts(receive);
for (int i = 0; i < 1024; buffer[i] = '\0', i++);
for (int a= 0, b = 0;(a=getchar())!='\n'&&b < 1024; buffer[b] = a, b++);
if (SOCKET_ERROR == send(clifd, buffer, strlen(buffer), 0))
err("send");
for (int i = 0; i < 1024; buffer[i] = '\0', i++);
for (int i = 0; i < BUF; receive[i] = '\0', i++);
if (0 < recv(clifd, receive, BUF, 0)) {
fputs(receive,stdout);
puts("`to skip");
for (int a = 0, b = 0; (a = getchar()) != '`'&&b < 1024; buffer[b] = a, b++);
if (SOCKET_ERROR == send(clifd, buffer, strlen(buffer), 0))
err("send");
}
getchar();
for (int i = 0; i < BUF; receive[i] = '\0', i++);
goto receiv;
}
puts(receive);
}
}
closesocket(clifd);
close_Socket();
puts("hit the enter key to exit");
//getchar();
getchar();
return 0;
}
tcpSocket.c代码:
#include"tcpSocket.h"
#include<stdio.h>
//open the net lib
bool init_Socket() {
WSADATA wsadata;
//启动Windows异步套接字
if (!WSAStartup(MAKEWORD(1, 1), &wsadata))
return true;
err("WSAStartup");
return false;
}
//colse the net lib
bool close_Socket() {
if (!WSACleanup())
return true;
err("WSACleanup");
return false;
}
//create server socket
SOCKET createServerSocket(const char * ip) {
//create empty socket
SOCKET ServerSocket=socket(AF_INET/*<-IPV4 AF_INET6 <- IPV6*/, SOCK_STREAM /*<-流式协议 SOCK_DGRAM<-报式协议 */ ,IPPROTO_TCP);//fuction1:af 地址协议族:ipv4&ipv6;fuction2:type 传输协议类型:流式&报式;fuction3:protocl 具体传输协议
if (ServerSocket != INVALID_SOCKET) {
//绑定端口&IP
struct sockaddr_in addr = { AF_INET/*同创建一致*/,htons(PORT)/*本地字节序转换网络字节序*/};
addr.sin_addr.S_un.S_addr = ip != NULL ? inet_addr(ip) : ADDR_ANY;
if (SOCKET_ERROR == bind(ServerSocket,(struct sockaddr*)&addr, sizeof(addr))) {
err("bind");
return false;
}
//监听端口
if (SOCKET_ERROR==listen(ServerSocket, 10)) {
err("listen");
return false;
}
return ServerSocket;
}
err("socket");
return INVALID_SOCKET;
}
//create client socket
SOCKET createClientSocket(const char *ip) {
SOCKET ClientSocket = socket(AF_INET/*<-IPV4 AF_INET6 <- IPV6*/, SOCK_STREAM /*<-流式协议 SOCK_DGRAM<-报式协议 */, IPPROTO_TCP);//fuction1:af 地址协议族:ipv4&ipv6;fuction2:type 传输协议类型:流式&报式;fuction3:protocl 具体传输协议
if (ClientSocket != INVALID_SOCKET) {
//建立链接
struct sockaddr_in addr = { AF_INET/*同创建一致*/,htons(PORT)/*本地字节序转换网络字节序*/ };
addr.sin_addr.S_un.S_addr = inet_addr(ip);// < -指定IP ADDR_ANY <-任意IP
if (INVALID_SOCKET==connect(ClientSocket, (struct sockaddr*)&addr, sizeof(addr))) {
err("connect");
return false;
}
return ClientSocket;
}
err("socket");
return INVALID_SOCKET;
}
tcpSocket.h代码:
#ifndef _TCPSOCKET_H_
#define _TCPSOCKET_H_
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#define err(x) fprintf(stderr, "[Line %d]%s failed,code:%d\n",__LINE__,x, WSAGetLastError())
#define PORT 62304
#include<stdbool.h>
//open the net lib
bool init_Socket();
//colse the net lib
bool close_Socket();
//create server socket
SOCKET createServerSocket(const char *);
//create client socket
SOCKET createClientSocket(const char *);
#endif
过程展示:
同一个机器测试:

不同机器测试(使用虚拟机,物理机同一个问题):


附录:文件排版
