=======================================================================client============================================================================================
养成判断错误的好习惯,为调试做准备
#include "common.h"
int main(int argc, char *argv[])
{
SU myaddr,serveraddr;//定义两个结构,一个用于绑定自己的ip和端口号,一个用于解析服务器的ip和端口号
int sockfd,ret;
char buf[15]="";//定义一个缓冲区,接收数据
sockfd = socket(AF_INET,SOCK_STREAM,0);// 服务器端开始建立sockfd描述符 AF_INET:ipv4 SOCK_STREAM : tcp
if( 0 > sockfd)
{
perror("socket");
exit(-1);
}
bzero(&serveraddr,sizeof(SU));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);//由系统获得本机地址
serveraddr.sin_port = htons(1566);//设置本机端口号
ret=bind(sockfd,(struct sockaddr *)&serveraddr,sizeof(struct sockaddr));//给自己注册,ip和端口号
if( 0 > ret)
{
perror("bind");
exit(-1);
}
bzero(&myaddr,sizeof(SU));
myaddr.sin_family= AF_INET;//ipv4
myaddr.sin_port = htons(1234);//服务器的端口号
myaddr.sin_addr.s_addr=htonl(INADDR_ANY);//这个是服务器的IP地址,我这时本机相连,所以由系统自己获得
//将本机器上的long数据转化为网络上的long数据
//INADDR_ANY i表示系统自动填充IP
//server_addr.sin_addr.s_addr=inet_addr("192.168.1.1");这个是服务器的IP地址
ret = connect(sockfd,(struct sockaddr *)&myaddr,sizeof(struct sockaddr));//与服务器建立连接
while(1)//不断接收
{
if( 0 > ret)
{
perror("connect");
exit(-1);
}
ret=recv(sockfd,buf,sizeof(buf),0); //倾听来自天堂的声音
if( 0 > ret)
{
perror("recv");
exit(-1);
}
sleep(2);//让效果更明显
printf("%s\n",buf);
printf("%d\n",ret);
}
close(sockfd);//关闭双向通信,可以使用shutdowm(int sockfd , int howto)由howto的值决定关闭的方式,0,关闭读 //通道,但是还可以继续写数据,1,关闭写通道,只能从套接字读取数据 ,2,关闭读写通道,和close一样
}
=======================================================================server============================================================================================
#include"common.h"
int main()
{
char buf[]="hello world!";
SU myaddr,clientaddr;
int sockfd,newfd;
sockfd = socket(AF_INET,SOCK_STREAM,0);
if( 0 > sockfd)
{
perror("socket");
exit(-1);
}
bzero(&myaddr,sizeof(myaddr));
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(1234);设置端口号
myaddr.sin_addr.s_addr =htonl(INADDR_ANY);// 服务器本机地址
int ret =bind(sockfd,(struct sockaddr*)&myaddr,sizeof(struct sockaddr));
if( 0 > ret)
{
perror("bind");
exit(EXIT_FAILURE);
}
ret = listen(sockfd,5);//
if( 0 > ret)
{
perror("listen");
exit(EXIT_FAILURE);
}
int addrlen =sizeof(clientaddr);
newfd =accept(sockfd,(struct sockaddr *)&clientaddr,&addrlen);//等待并接收客户端的连接请求
if( 0 > ret)
{
perror("accept");
exit(EXIT_FAILURE);
}
while(1)//不断发送
{
printf("%s,%d",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));//将服务器传来的网络地址转化为点乘十进制,将其端口转换为本地端口
ret = send(newfd,buf,sizeof(buf),0);//发送弦外之音
if( 0 > ret)
{
perror("send");
exit(1);
}
sleep(2);//让效果更明显
}
close(newfd);
return 0;
}
=======================================================================common.h============================================================================================
#ifndef _COMMON_H_
#define _COMMON_H_
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>//struct sockaddr_in,INADDR_ANY的定义
#define SU struct sockaddr_in
#include <string.h>
#include <netinet/in.h>//htonl
#endif
转载于:https://blog.51cto.com/shanying/560579