VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 645|回复: 4

socket小程序,变量莫名其妙改变

[复制链接]

1

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-1-23 18:20:01 | 显示全部楼层 |阅读模式
客户端:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#include <errno.h>

void* client(void* p)
{
        int sockfd, new_fd, i=0, j=0, nbytes;
        struct sockaddr_in s_addr;
        struct sockaddr_in c_addr;
        char *tmp=(char*)p;

        char ip[20],port[6];

        while(tmp[i]!=':')
        {
                ip[i]=tmp[i];
                i++;
        }
        ip[i++]='\0';

        while(tmp[i]) port[j++]=tmp[i++];
        port[j]='\0';


        for (i=0; i<10000; ++i)
        {
                sockfd=socket(AF_INET, SOCK_STREAM, 0);
                if (sockfd==-1)
                {
                        printf("Client Error. %s\n", strerror(errno));
                        return;
                }

                s_addr.sin_family = AF_INET;
                s_addr.sin_port = htons(atoi(port));//第二次循环的时候,port变了
                s_addr.sin_addr.s_addr = inet_addr(ip);
                bzero(&(s_addr.sin_zero), sizeof(s_addr.sin_zero));


                while (connect(sockfd, (struct sockaddr *)&s_addr, sizeof(struct sockaddr))==-1)
                {
                        printf("Client Error. %s\n", strerror(errno));
                }

                char buffer[10];

                if((nbytes=read(sockfd,buffer,1024))==-1)
                {
                        printf("Client Error. %s\n", strerror(errno));
                }

                if (buffer[0]=='M')
                        printf("%s\n",buffer);

                close(sockfd);
        }
        return;
}


int main(int argc, char* argv[])
{

        if (argc<2)
        {
                printf("Usage: 1.out server's IP:server's port");
                printf("Example: 1.out 192.168.0.1:4444\n");
                return -1;
        }

        client(argv[1]);

        return 0;
}
---------------------------------
服务器端:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#include <errno.h>

void* server(void* p)
{
        int sockfd, new_fd, i=0, j=0;
        struct sockaddr_in s_addr;
        struct sockaddr_in c_addr;
        char *tmp=(char*)p;

        char ip[20],port[6];

        while(tmp[i]!=':')
        {
                ip[i]=tmp[i];
                i++;
        }
        ip[i++]='\0';

        while(tmp[i]) port[j++]=tmp[i++];
        port[j]='\0';

        sockfd=socket(AF_INET, SOCK_STREAM, 0);
        if (sockfd==-1)
        {
                printf("Server Error. %s\n", strerror(errno));
                return;
        }

        s_addr.sin_family = AF_INET;
        s_addr.sin_port = htons(atoi(port));
        s_addr.sin_addr.s_addr = inet_addr(ip);
        bzero(&(s_addr.sin_zero), sizeof(s_addr.sin_zero));

        if (bind(sockfd, (struct sockaddr *)&s_addr, sizeof(struct sockaddr))==-1)
        {
                printf("Server Error. %s\n", strerror(errno));
                return;
        }

        if (listen(sockfd, 500)==-1)
        {
                printf("Server Error. %s\n", strerror(errno));
                return;
        }

        char s[32], c[6];

        for (i=0; i<10000; ++i)
        {
                s[0]='\0';
                if (i%3==0) strcpy(s, "M");
                sprintf(c,"%d",i);
                strcat(s, c);
                strcat(s, "\n");

                if ((new_fd = accept(sockfd, NULL, NULL))==-1)
                        printf("Server Error. %s\n", strerror(errno));
                printf("%s\n", s);
                write(new_fd, s, sizeof(s));
                close(new_fd);
        }

        close(sockfd);
        return;
}



int main(int argc, char* argv[])
{

        if (argc<2)
        {
                printf("Usage: 1.out server's IP:server's port client's");
                printf("Example: 1.out 192.168.0.1:4444\n");
                return -1;
        }

        server(argv[1]);

        return 0;
}
-----------------------------
用gdb跟踪客户端程序,发现port自己变了,导致connect失败,不知道为何
gcc 3.2.2
回复

使用道具 举报

0

主题

4

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-2-7 16:45:02 | 显示全部楼层
?
端口固定,可以成功吗
回复

使用道具 举报

1

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-2-8 00:30:01 | 显示全部楼层
把清零的那段程序,放到循环外面,就可以了....
回复

使用道具 举报

1

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-2-8 13:15:02 | 显示全部楼层
错误出在

char buffer[10];

                if((nbytes=read(sockfd,buffer,1024))==-1)
                {
                        printf("Client Error. %s\n", strerror(errno));
                }

溢出了
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-2-8 13:30:01 | 显示全部楼层
char buffer[10];

if((nbytes=read(sockfd,buffer,1024))==-1)
会不会是缓冲区溢出修改了.......
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表