linux socket通信源码


初学Socket通信,参考的是LinuxC程序设计大全的23章的23-5例子,但是发现这个例子源码里有好几处错误,因为初学,很多不懂,吃了亏,因此将修改后能正常运行的代码记录在这里 ,参考http://www.cnblogs.com/xudong-bupt/archive/2013/12/29/3483059.html:

server.c 

#include<stdio.h>
#include<unistd.h>
#include<ctype.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<string.h>
#include<stdlib.h>


#define MAX_LEN 100




void upper2lower(char *p)
{
    if(p == NULL){
        return ;
    }
    for(;*p !='\0';p++){
        if(*p >='a' && *p <='z'){
            *p -= ('a' - 'A');
        }
    }
    
}


int main (int argc ,char **argv)
{
    struct sockaddr_in sin;
    struct sockaddr_in cin;
    int listen_fd,connect_fd;
    socklen_t len;
    char buf[MAX_LEN];
    char addr_p[INET_ADDRSTRLEN]; /** 这个长度在哪里定义*/
    int port= 8887;
    int n;
    int ret;
    bzero(&sin,sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr =htonl(INADDR_ANY);// 接受任意的IP
    sin.sin_port = htons(port);
    
    listen_fd = socket(AF_INET,SOCK_STREAM,0);
    printf("listen_fd= %d\n",listen_fd);
    ret =  bind(listen_fd,(struct sockaddr*)&sin,sizeof(sin));
    printf("ret= %d\n",ret);
    ret =  listen(listen_fd,10);
    printf("ret= %d\n",ret);
    printf("Waiting ...\n");
    len = sizeof(cin);
    while(1){
        connect_fd = accept(listen_fd,(struct sockaddr*)&cin,&len);
        
        printf("connect_fd= %d\n",connect_fd);
        n = read (connect_fd,buf,MAX_LEN);
        printf("read Len = %d\n",n);
        inet_ntop(AF_INET,&cin.sin_addr,addr_p,sizeof(addr_p));//地址格式转化,点分十进制转换成字符串 
      
        printf("client IP is %s,port is %d \n",addr_p,ntohs(cin.sin_port));
        
        printf("connectis %s\n",buf);
        upper2lower(buf);
        write(connect_fd,buf,n);
        close(connect_fd);


    }
        if(close(listen_fd)==-1){
            perror("fail to close ");  /**注意这里打印输出的信息*/
            exit(1);
        }
    return 0;
}


client.c

#include<stdio.h>
#include<unistd.h>
#include<ctype.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<string.h>
#include<stdlib.h>
#define MAX_LEN 100

int main (int argc ,char **argv)
{
struct sockaddr_in sin;




char buf[MAX_LEN];
int sfd;
char addr_p[INET_ADDRSTRLEN]; /** 这个长度在哪里定义*/
int port= 8887;
char *Send = "senddate";

if(argc > 1){
Send = argv[1];
}


bzero(&sin,sizeof(sin));


sin.sin_family = AF_INET; // IPv4

inet_pton(AF_INET,"127.0.0.1",&sin.sin_addr); //地址格式转化,字符串转换成点分十进制
    
sin.sin_port = htons(port); //主机字节序转换网络字节序 




sfd = socket(AF_INET,SOCK_STREAM,0);

if((connect(sfd,(struct sockaddr *)&sin,sizeof(sin)))<0){
        perror("connect");
        exit(1);

}
printf("start send data =%s\n",Send);
write(sfd,Send,strlen(Send)); /**发送字符串,包含字符串结束符*/

read(sfd,buf,MAX_LEN);
printf("receive from server : %s\n",buf);
close(sfd);
return 0;


}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值