C语言 服务器发回不需要的字符

1l5u6lss  于 2022-12-26  发布在  其他
关注(0)|答案(2)|浏览(100)
#include <io.h>
#include <stdio.h>
#include <winsock2.h>
#include <string.h>

#define MY_PORT     8989
#define MAXBUF      256

int main(int argc, char *argv[]){
    WSADATA wsa;
    SOCKET sockfd ,clientfd; //define 2 sockets
    struct sockaddr_in self;
    char buffer[MAXBUF];

    printf("\nInitialising Winsock...");
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0){
        printf("Failed. Error Code : %d",WSAGetLastError());
        return 1;
    }
    printf("Initialised.\n");

    /*---create streaming socket---*/
    if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ){
        perror("Socket");
        exit(errno);
    }
    printf("Socket created.\n");

    /*---initialize address/port structure---*/
    /* bzero(&self, sizeof(self));*/
    self.sin_family = AF_INET;
    self.sin_port = htons(MY_PORT);
    self.sin_addr.s_addr = INADDR_ANY;

    /*---assign a port number to the socket---*/
    if ((bind(sockfd, (struct sockaddr*)&self, sizeof(self)))!=0){
        perror("socket--bind");
        exit(errno);
    }
    puts("Bind done");

    /*---make it a "listening socket"---*/
    if ((listen(sockfd, 20))!=0){
        perror("socket--listen");
        exit(errno);
    }
    puts("Waiting for incoming connections...");

    /*---forever... ---*/
    while (1){
        struct sockaddr_in client_addr;
        int addrlen=sizeof(client_addr);

        /*---accept a connection (creating a data pipe)---*/
        clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &addrlen);

        //create variables
        int length=recv(clientfd, buffer, MAXBUF, 0);

        //output in reverse order & lowercase
        for(int i=0; buffer[i]!='\0'; i++){
            if(buffer[i]>=65 && buffer[i]<=90){ // check ascii value
                buffer[i]= buffer[i]+32;       // if uppercase thn change
            }
        }

        int loop=0, len=strlen(buffer);
        char temp;  //temporary holds character to swap

        len--;     // remove null and start from 0

        while (loop<len){
            temp=buffer[loop];
            buffer[loop]=buffer[len];
            buffer[len]=temp;
            loop++;
            len--;
        }

        //send back
        send(clientfd, buffer, sizeof(buffer), 0);

        /*---close connection---*/
        close(clientfd);
    }

    /*---clean up (should never get here!)---*/
    close(sockfd);
    WSACleanup();
    return 0;
}

从客户端反转字符串工作得很好,但它也给出了许多其他不需要的字符后面,它和两个'PuTTy的,我是非常新的套接字编程,所以任何帮助是非常感谢。我不能使用任何字符串函数以外的strlen。目前使用puTTy打开8989服务器。远程登录连接是被动的。

edqdpe6u

edqdpe6u1#

您的代码假定buffer以NUL终止,但是不能保证recv(可能是recv的一部分,这是流套接字)会接收到NUL字符。
使用recv的返回值(如果是正值)来反转数据会更有意义,这样就不必担心消息边界。

int length=recv(clientfd, buffer, MAXBUF, 0);

    //output in reverse order & lowercase
    for(int i=0; i < length; i++){
        if(buffer[i]>=65 && buffer[i]<=90){ // check ascii value
            buffer[i]= buffer[i]+32;       // if uppercase thn change
        }
    }
ztmd8pv5

ztmd8pv52#

您总是发送MAXBUF(即256)字节,因为在

send(clientfd, buffer, sizeof(buffer), 0);

sizeof(buffer)是声明的字符数组的大小

#define MAXBUF      256
char buffer[MAXBUF];

例如,可以使用strlen(buffer)来修复此问题,或者保留您之前获得的len

相关问题