socket

原文

https://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html

因为in.h中包含了sys/socket.h,所以就不用include了 

server.c
#include <stdio.h>
#include <netinet/in.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#define MAXLINE 4096
int main(int argc,char** argv)
{
int listenfd,connfd;
struct sockaddr_in servaddr;// need in.h
char buff[4096];
int n;
if((listenfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
printf("create socket error:%s(errno:%d)\n",strerror(errno),errno);// need string.h and errno.h
exit(0);// need stdlib.h
}
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;

servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

//mysock.sin_addr.s_addr = inet_addr("166.111.160.10"); //设置IP地址

servaddr.sin_port = htons(6666);
if(bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr)) == -1)
{
printf("bind socket error:%s(errno:%d)\n",strerror(errno),errno);
exit(0);
}
if(listen(listenfd,10) == -1)
{
printf("listen socket error %s(errno:%d)\n",strerror(errno),errno);
exit(0);
}
printf("------waiting for client's request--------\n");
while(1)
{
if((connfd = accept(listenfd,(struct sockaddr*)NULL,NULL)) == -1)
{
printf("accept socket error:%s(errno:%d)\n",strerror(errno),errno);
continue;
}
n = recv(connfd,buff,MAXLINE,0);
buff[n] = '\0';
printf("recv msg from client:%s\n",buff);

close(connfd);// need unistd.h

// struct sockaddr_in client_addr;    
        // socklen_t cliaddr_len = sizeof(client_addr);       
        // char cli_ip[INET_ADDRSTRLEN] = "";       
          
        // int connfd;  
        // connfd = accept(sockfd, (struct sockaddr*)&client_addr, &cliaddr_len);         
        // if(connfd < 0)  
        // {  
        //     printf("accept socket error:%s(errno:%d)\n",strerror(errno),errno);  
        //     continue;  
        // }  
  
        // inet_ntop(AF_INET, &client_addr.sin_addr, cli_ip, INET_ADDRSTRLEN);  
        // printf("client ip=%s,port=%d\n", cli_ip,ntohs(client_addr.sin_port));  
          
        // char recv_buf[512] = {0};  
        // int len =  recv(connfd, recv_buf, sizeof(recv_buf), 0);  
          
        // printf("recv data:%s\n",recv_buf);  
          
        // send(connfd, recv_buf, len, 0);  
          
        // close(connfd);

}
close(listenfd);
return 0;
}




client.c
#include <stdio.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <arpa/inet.h>
#define MAXLINE 4096
int main(int argc,char** argv)
{
int sockfd;
int n;
char recvline[MAXLINE],sendline[MAXLINE];
struct sockaddr_in servaddr;
if(argc != 2)
{
printf("usage:./client<ipaddress>\n");
exit(0);
}
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
{
printf("create socket error:%s(errno:%d)\n",strerror(errno),errno);
exit(0);
}
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(6666);
if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr) <= 0)// need inet.h
{
printf("inet_pton error for %s\n",argv[1]);
exit(0);
}
if(connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr)) < 0)
{
printf("connect error:%s(errno:%d)\n",strerror(errno),errno);
exit(0);
}
printf("send msg to server:\n");
fgets(sendline,4096,stdin);
if(send(sockfd,sendline,strlen(sendline),0) < 0)
{
printf("send msg error:%s(errno:%d)\n",strerror(errno),errno);
exit(0);
}
close(sockfd);
return 0;
}


运行:
先启动服务器 

运行客户端时输入服务器的ip,成功连接后输入要向服务器发送的消息


上面是tcp,下面看一下udp

参考http://blog.csdn.net/u012234115/article/details/54142273

server.c

#include <stdio.h>
#include <netinet/in.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#define BUFSIZE 1024
int main()
{
int listenfd;
if((listenfd = socket(PF_INET,SOCK_DGRAM,0)) < 0)
{
printf("create socket error:%s(errno:%d)\n",strerror(errno),errno);
return 0;
}
struct sockaddr_in seraddr;
memset(&seraddr,0,sizeof(seraddr));
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(8000);
seraddr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(listenfd,(struct sockaddr*)&seraddr,sizeof(seraddr)) < 0)
{
printf("bind error:%s(errno:%d)\n",strerror(errno),errno);
return 0;
}
int len;
int sinSize = sizeof(struct sockaddr_in);
char buf[BUFSIZE];
struct sockaddr_in cliaddr;
if((len = recvfrom(listenfd,buf,BUFSIZE,0,(struct sockaddr*)&cliaddr,(socklen_t *)&sinSize)) < 0)
{
printf("recvfrom error:%s(errno:%d)\n",strerror(errno),errno);
return 0;
}
// printf("received packet from %d\n",inet_ntoa(cliaddr.sin_addr));
buf[len] = '\0';
printf("the recvmsg is:%s\n",buf);
close(listenfd);
return 0;
}

client.c

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define BUFSIZE 1024
int main(int argc,char** argv)
{
if(argc != 2)
{
printf("the argc is invalid\n");
return 0;
}
int sockfd;
if((sockfd = socket(PF_INET,SOCK_DGRAM,0)) < 0)
{
printf("create socket error:%s(errno:%d)\n",strerror(errno),errno);
return 0;
}
struct sockaddr_in seraddr;
memset(&seraddr,0,sizeof(seraddr));
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(8000);
if(inet_pton(AF_INET,argv[1],&seraddr.sin_addr) <= 0)
{
printf("inet_pton error:%s\n",argv[1]);
return 0;
}
printf("please enter the message\n");
char buf[BUFSIZE] = {0};
fgets(buf,BUFSIZE,stdin);
int sinSize = sizeof(struct sockaddr_in);
int len;
if((len = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&seraddr,sizeof(seraddr))) < 0)
{
printf("sendto error:%s\n",argv[1]);
return 0;
}
close(sockfd);
return 0;
}

运行方式和tcp一样

但是server不用listen和accept,client不用connect

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值