日志2
代码修改:
客户端修改
问题1:
‘serv_adr’的存储大小未知 struct sockaddr_in serv_adr;
解决办法:
加上头文件:#include <arpa/inet.h>
#提供IP地址转换函数
问题2:
警告:隐式声明函数‘xxx’ [-Wimplicit-function-declaration]
解决办法 :
一般的解决方式:在程序前面增加函数头说明即可,否则是用默认说明(隐式说明)来解释函数调用规则,
比如返回值默认是int就是在你不说明时起作用的。
问题3:
:‘AF_INET’未声明(在此函数内第一次使用)
if ((orig_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
解决办法:
那是因为在gcc中AF_INET定义在这个头文件中,
#include <sys/socket.h>
在mingw已经没有这个头文件了,在mingw中AF_INET定义在
#include <winsock2.h>
问题4:
client.c:2:8: 错误:expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘int’
typede int socklen_t;
解决办法
报错原因:
翻译:语法错误,缺少了一些必要的符号。
注意检查:
1、注意检查头文件前的有没加井号“#”
2、声明函数的时候()后面有没加分号“;”
typedef int socklen_t;
问题5 :
client.c:51:5: 错误:未知的类型名‘WSADATA’
WSADATA ws;
^
client.c:52:5: 警告:隐式声明函数‘WSAStartup’ [-Wimplicit-function-declaration]
WSAStartup(MAKEWORD(2, 2), &ws);
解决办法
去除: WSADATA ws;
WSAStartup(MAKEWORD(2, 2), &ws);
问题6:
# gcc -Wall -o client client.c
gcc client.c -o client -lws2_32 -Wall
/usr/bin/ld: 找不到 -lws2_32
collect2: 错误:ld 返回 1
make: *** [client] 错误 1
解决办法
去掉-lws2_32
原错误1:
# gcc -Wall -o client client.c
gcc client.c -o client -lws2_32 -Wall
In file included from client.c:7:0:
/usr/include/unistd.h:274:21: 错误:与‘socklen_t’类型冲突
typedef __socklen_t socklen_t;
^
client.c:2:13: 附注:‘socklen_t’的上一个声明在此
typedef int socklen_t;
^
client.c: 在函数‘socket_init’中:
client.c:19:24: 错误:‘serv_adr’的存储大小未知
struct sockaddr_in serv_adr;
^
client.c:24:5: 警告:隐式声明函数‘socket’ [-Wimplicit-function-declaration]
if ((orig_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
^
client.c:24:29: 错误:‘AF_INET’未声明(在此函数内第一次使用)
if ((orig_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
^
client.c:24:29: 附注:每个未声明的标识符在其出现的函数内只报告一次
client.c:24:38: 错误:‘SOCK_STREAM’未声明(在此函数内第一次使用)
if ((orig_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
^
client.c:31:5: 警告:隐式声明函数‘inet_addr’ [-Wimplicit-function-declaration]
serv_adr.sin_addr.s_addr = inet_addr("127.0.0.1");
^
client.c:33:5: 警告:隐式声明函数‘htons’ [-Wimplicit-function-declaration]
serv_adr.sin_port = htons(PORT);
^
client.c:35:5: 警告:隐式声明函数‘connect’ [-Wimplicit-function-declaration]
if (connect(orig_sock, (struct sockaddr *) &serv_adr,
^
client.c:19:24: 警告:未使用的变量‘serv_adr’ [-Wunused-variable]
struct sockaddr_in serv_adr;
^
client.c: 在函数‘main’中:
client.c:49:5: 错误:未知的类型名‘WSADATA’
WSADATA ws;
^
client.c:50:5: 警告:隐式声明函数‘WSAStartup’ [-Wimplicit-function-declaration]
WSAStartup(MAKEWORD(2, 2), &ws);
^
client.c:50:5: 警告:隐式声明函数‘MAKEWORD’ [-Wimplicit-function-declaration]
client.c:65:5: 警告:隐式声明函数‘send’ [-Wimplicit-function-declaration]
send(orig_sock,&buf[0], 1, 0); // Windows
^
client.c:70:9: 警告:隐式声明函数‘recv’ [-Wimplicit-function-declaration]
ret += recv(orig_sock, buf + ret, SIZE - ret, 0); // Windows
刷新后的原错误2:
# gcc -Wall -o client client.c
gcc client.c -o client -lws2_32 -Wall
client.c:2:8: 错误:expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘int’
typede int socklen_t;
^
client.c: 在函数‘main’中:
client.c:51:5: 错误:未知的类型名‘WSADATA’
WSADATA ws;
^
client.c:52:5: 警告:隐式声明函数‘WSAStartup’ [-Wimplicit-function-declaration]
WSAStartup(MAKEWORD(2, 2), &ws);
^
client.c:52:5: 警告:隐式声明函数‘MAKEWORD’ [-Wimplicit-function-declaration]
原代码:
#include <winsock2.h>
typedef int socklen_t;
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
const char *NAME = "./my_sock";
#define MSG "Hello world!"
#define MAX 1024
const int PORT = 9535;
int orig_sock;
//int main()
int socket_init(void) {
struct sockaddr_in serv_adr;
// struct hostent *host;
// host = gethostbyname("localhost");
if ((orig_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("generate error");
return 1;
}
memset(&serv_adr, 0, sizeof(serv_adr));
serv_adr.sin_family = AF_INET;
serv_adr.sin_addr.s_addr = inet_addr("127.0.0.1");
// memcpy(&serv_adr.sin_addr, host->h_addr, host->h_length);
serv_adr.sin_port = htons(PORT);
if (connect(orig_sock, (struct sockaddr *) &serv_adr,
sizeof(serv_adr)) < 0) {
perror("connect error");
return 2;
}
return 0;
}
//#define SIZE 1048576*8
#define SIZE 1024
int main() {
WSADATA ws;
WSAStartup(MAKEWORD(2, 2), &ws);
// char buf[MAX];
char *buf;
ssize_t ret = 0;
FILE *fp = fopen("a.bin", "wb");;
buf = malloc(SIZE);
socket_init();
buf[0] = '1';
printf("Sending a request\n");
// write(orig_sock, &buf[0], 1); // Linux
send(orig_sock,&buf[0], 1, 0); // Windows
printf("Waiting for server...\n");
do {
// ret += read(orig_sock, buf + ret, SIZE - ret); // Linux
ret += recv(orig_sock, buf + ret, SIZE - ret, 0); // Windows
} while (ret != SIZE);
printf("read total: %zu bytes\n", ret);
fwrite(buf, SIZE, 1, fp);
buf[0] = '0';
printf("Sending end request, bye~\n");
// write(orig_sock, &buf[0], 1); // Linux
send(orig_sock, &buf[0], 1,0);
printf("\n");
close(orig_sock);
free(buf);
fclose(fp);
getchar();
return 0;
服务端修改:
去掉 WSADATA ws; WSAStartup(MAKEWORD(2, 2), &ws);
去掉#include <winsock2.h> typedef int socklen_t;
加上头文件:#include <sys/socket.h>
#提供socket函数及数据结构
加上头文件:#include <arpa/inet.h>
#提供IP地址转换函数
server.c: 在函数‘start_socket’中:
server.c:31:5: 警告:隐式声明函数‘socket’ [-Wimplicit-function-declaration]
if ((orig_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
^
server.c:31:29: 错误:‘AF_INET’未声明(在此函数内第一次使用)
if ((orig_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
^
server.c:31:29: 附注:每个未声明的标识符在其出现的函数内只报告一次
server.c:31:38: 错误:‘SOCK_STREAM’未声明(在此函数内第一次使用)
if ((orig_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
^
server.c: 在函数‘start_bind’中:
server.c:37:32: 错误:invalid application of ‘sizeof’ to incomplete type ‘struct sockaddr_in’
memset(&serv_adr, 0, sizeof(serv_adr));
^
server.c:38:5: 错误:对未定义类型‘struct sockaddr_in’的使用无效
serv_adr.sin_family = AF_INET;
^
server.c:38:27: 错误:‘AF_INET’未声明(在此函数内第一次使用)
serv_adr.sin_family = AF_INET;
^
server.c:39:5: 错误:对未定义类型‘struct sockaddr_in’的使用无效
serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
^
server.c:39:5: 警告:隐式声明函数‘htonl’ [-Wimplicit-function-declaration]
server.c:39:38: 错误:‘INADDR_ANY’未声明(在此函数内第一次使用)
serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
^
server.c:40:5: 错误:对未定义类型‘struct sockaddr_in’的使用无效
serv_adr.sin_port = htons(PORT);
^
server.c:40:5: 警告:隐式声明函数‘htons’ [-Wimplicit-function-declaration]
server.c:42:5: 警告:隐式声明函数‘bind’ [-Wimplicit-function-declaration]
if (bind(orig_sock, (struct sockaddr *) &serv_adr,
^
server.c:43:20: 错误:invalid application of ‘sizeof’ to incomplete type ‘struct sockaddr_in’
sizeof(serv_adr)) < 0) {
^
server.c: 在函数‘start_listen’中:
server.c:50:5: 警告:隐式声明函数‘listen’ [-Wimplicit-function-declaration]
listen(orig_sock, 5);
^
server.c: 在函数‘start_accept’中:
server.c:54:22: 错误:invalid application of ‘sizeof’ to incomplete type ‘struct sockaddr_in’
clnt_len = sizeof(clnt_adr);
^
server.c:55:5: 警告:隐式声明函数‘accept’ [-Wimplicit-function-declaration]
if ((new_sock = accept(orig_sock, (struct sockaddr *) &clnt_adr, &clnt_len)) < 0) {
^
server.c: 在函数‘main’中:
server.c:86:9: 警告:隐式声明函数‘recv’ [-Wimplicit-function-declaration]
recv(new_sock, &recv_buf[0], 1, 0); // Windows
^
server.c:97:17: 警告:隐式声明函数‘send’ [-Wimplicit-function-declaration]
ret += send(new_sock, clnt_buf, SIZE - ret, 0); // Windows
原代码:
#include <winsock2.h>
typedef int socklen_t;
//#include <stdio.h>
//#include <unistd.h>
//#include <string.h>
//#include <sys/types.h>
//#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
//#include <arpa/inet.h>
//#include <sys/socket.h>
//#include <netinet/in.h>
#include <fcntl.h>
const char *NAME = "./my_sock";
#define MAX 1024
socklen_t clnt_len;
int orig_sock, new_sock;
static struct sockaddr_in clnt_adr, serv_adr;
const int PORT = 9535;
void clean_up(int, const char *);
void start_socket() {
if ((orig_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("generate error");
}
}
void start_bind() {
memset(&serv_adr, 0, sizeof(serv_adr));
serv_adr.sin_family = AF_INET;
serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_adr.sin_port = htons(PORT);
if (bind(orig_sock, (struct sockaddr *) &serv_adr,
sizeof(serv_adr)) < 0) {
perror("bind error");
clean_up(orig_sock, NAME);
}
}
void start_listen() {
listen(orig_sock, 5);
}
void start_accept() {
clnt_len = sizeof(clnt_adr);
if ((new_sock = accept(orig_sock, (struct sockaddr *) &clnt_adr, &clnt_len)) < 0) {
perror("accept error");
clean_up(orig_sock, NAME);
}
}
//#define SIZE 1048576*8
#define SIZE 1024
int main(int argc, char **argv) {
WSADATA ws;
WSAStartup(MAKEWORD(2, 2), &ws);
char *clnt_buf;
char recv_buf[MAX];
memset(recv_buf, 'k', MAX);
ssize_t ret;
clnt_buf = malloc(SIZE);
memset(clnt_buf, 'M', SIZE);
start_socket();
start_bind();
start_listen();
start_accept();
for (;;) {
// int flags = fcntl(new_sock, F_GETFL, 0);
// flags &= ~O_NONBLOCK;
// fcntl(new_sock, F_SETFL, flags);
// read(new_sock, &recv_buf[0], 1); // Linux
recv(new_sock, &recv_buf[0], 1, 0); // Windows
// printf("recv_buf[0] ->XX%cXX\n",recv_buf[0] );
// printf("recv_buf[2] ->XX%cXX\n",recv_buf[2] );
// printf("recv_buf[5] ->XX%cXX\n",recv_buf[5] );
while (recv_buf[0] == '1') {
ret = 0;
do {
// ret += write(new_sock, clnt_buf, SIZE - ret); // Linux
ret += send(new_sock, clnt_buf, SIZE - ret, 0); // Windows
printf("write %zu bytes\n", ret);
} while (ret != SIZE);
// read(new_sock, &recv_buf, 1); // Linux
recv(new_sock, &recv_buf[0], 1, 0); // Windows
}
printf("Client ask me to close\n");
close(new_sock);
printf("Wait for another connection\n");
start_accept();
}
close(new_sock);
free(clnt_buf);
clean_up(orig_sock, NAME);
return 0;
}
void clean_up(int sd, const char *the_file) {
close(sd);
unlink(the_file);
}