服务器回显时套接字编程错误

时间:2014-06-09 06:20:04

标签: c sockets client-server

我已经为客户端和服务器端编写了一个套接字编程代码...基本上当我的客户端输入消息时,我的服务器回复了该消息...我的问题只有......如果我是输入hieee

echo: hieee

然后如果我输入输入信息:it

echo: it
ee <--this extra line is being print which i am not able to figure out why... :(

我的服务器代码:

#include <stdio.h>
#include <string.h>    
#include <stdlib.h>    
#include <sys/socket.h>
#include <arpa/inet.h> 
#include <unistd.h>    
#include <pthread.h>
#include <sys/ipc.h>
#include <sys/uio.h>
#define NTHREADS 100

void *connection_handler(void *);
pthread_t thread_id[NTHREADS];
int sockfd,d1;
struct sockaddr_in server , client;

struct msg_q {
    size_t in_index;
    size_t out_index;
    unsigned int data[2048];
    pthread_mutex_t lock;
};    
// Socket create
int sock_create( )
{
    sockfd= socket(AF_INET , SOCK_STREAM , 0);

    if (sockfd <0)
    {
        printf("Could not create socket");  
        return 1;
    }
    puts("Socket created");
    memset(&server,0,sizeof(server));
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons( 2100);
}      
// Bind
int sock_bind()
{
    int b= bind(sockfd,(struct sockaddr *)&server , sizeof(server));
    if (b <0)
    {
        perror("Bind failed. Error");
        return 1;
    }
    puts("Bind");

}
// Listen
int sock_listen()
{
   listen(sockfd , 10);
}
//Connection accept
int sock_accept()
{
    int s = sizeof(struct sockaddr_in);
    d1= accept(sockfd, (struct sockaddr *)&client, (socklen_t*)&s);

    if (d1 < 0)
    {
        perror("accept failed");
        return 1;
    } 
    puts("Connection accepted");
}

int main(int argc , char *argv[])
{  int client_sock;
   sock_create();
   sock_bind();
   sock_listen();
   sock_accept();

    struct msg_q msg_queue[100];

    pthread_exit

        pthread_attr_t attr;
        int i,j;
        pthread_attr_init(&attr);
        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
        printf("Creating threads\n");

    int cli_sock=client_sock;

    for (i = 0; i < NTHREADS ; i++)
    {
        pthread_create(&(thread_id[i]), &attr, connection_handler, (void*) &cli_sock);
    }

    pthread_attr_destroy(&attr); //Free attribute, wait for the other threads
    for(j=0; j < NTHREADS; j++)
    {
        pthread_join( thread_id[j], NULL);
    }
    pthread_exit(NULL);
    return 0;
}

void *connection_handler(void *sfd)
{   
    int sock = d1;
    int read_size=0;
    char *message , client_message[2000];

    //Receive msg from client
    while( (read_size = recv(sock , client_message , 2000 , 0)) > 0 )
    {   
        client_message[read_size] = '\0';
        //back to client

        write(sock, client_message , strlen(client_message));
        memset(client_message,'\0',sizeof(client_message));

    }
     if(read_size == 0)
    {
        puts("Client disconnected");
        fflush(stdout);
    }
    else if(read_size == -1)
    {
        perror("Recv failed");    
    }
    pthread_exit((void*) sfd);
    return 0;
}

我的客户代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

int main(int argc , char *argv[])
{
    int sockfd;
    struct sockaddr_in servaddr;
    char msg[1000] , servaddr_reply[2000];

// Create socket
    if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) <0)
    {
        printf("Could not create socket\n");
        return 1;
    }
    puts("Socket created");

    servaddr.sin_family= AF_INET;
    servaddr.sin_port= htons(2100);
    servaddr.sin_addr.s_addr= inet_addr("10.205.28.13");
 //Connect to server
    if (connect(sockfd , (struct sockaddr *)&servaddr , sizeof(servaddr)) <0)
    {
        perror("Connection failed\n");
        return 1;
    }
    puts("Connected");

    while(1)
    {
        printf("Enter msg:");
        fflush(stdout);
        bzero(msg,1000);
        scanf("%s" , msg);

        if( write(sockfd , msg , strlen(msg)) < 0)
        {
            puts("Send failed");
            return 1;
        }

        if( read(sockfd, servaddr_reply , 2000) < 0)
        {
            puts("Recv failed");
            break;
        }
        puts("Echo: ");
        puts(servaddr_reply);
        fflush(stdout);              
    }
        close (sockfd);
        return 0;
}

请帮忙,因为我不熟悉套接字编程......

1 个答案:

答案 0 :(得分:0)

read()在响应后不添加空终止符。如果要将响应视为以null结尾的字符串,则必须自己添加:

int len;
if ((len = read(sockfd, servaddr_reply, sizeof(servaddr_reply)-1)) < 0) 
{
    puts("Recv failed");
    break;
}
servaddr_reply[len] = 0; // Add null terminator
puts(servaddr_reply);
fflush(stdout);