实习日志2代码更改

3 篇文章 0 订阅
3 篇文章 0 订阅

日志2

代码修改:

CentOS------编辑、修改文件命令

linux网络编程常用头文件

客户端修改

问题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_inmemset(&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_insizeof(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);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值