-------------示例来源于网络视频
服务器端:
端口号的值,不能超过65536,(2个字节)而1000以下的端口号是系统用的。
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <strings.h>
#define S_IP "127.0.0.1"
#define S_PORT 8888
int main()
{
int fd,cfd;
struct sockaddr_in addr,c_addr;
socklen_t c_addr_len;
char buf[BUFSIZ],clie_IP[BUFSIZ];//BUFSIZ系统自定义的宏
int n;
fd = socket(AF_INET,SOCK_STREAM,0);
bzero(&addr,sizeof(addr);
addr.sin_family = AF_INET;
addr.sin_port = htons(S_PORT);//转化成网络字节序
// addr.sin_addr.s_addr = inet_pton(S_IP);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(fd,(struct sockaddr *)&addr,sizeof(addr));
listen(fd,128);//128是默认值,也是最大值
c_addr_len = sizeof(c_addr);//容器的大小,传入函数后,返回的是实际的大小
//while(1){//放在此处,可以不断的去与多个客户端建立连接
cfd = accept(fd,(struct sockaddr *)&c_addr,&c_addr_len);
//读取连接过来的客户端的ip和port//ip是int--->string且得是网络字节序转本地字节序
printf(client ip:%s,client port:%d,
inet_ntop(AF_INET,&clie_addr.sin_addr.s_addr,cli_IP,sizeof(cli_IP),
ntohs(clie_addr.sin_port);
while(1)//不断的监听数据
{
n = read(cfd,buf,sizeof(buf));
for(int i =0;i<n;i++)
{
buf[i] = toupper(buf[i]);
}
write(cfd,buf,n);
}
close(fd);
close(cfd);
}
客户端:
客户端中struct sockaddr_in addr 为connect连接的服务器端的ip地址和端口号;
客户端中也可以使用bind函数,来绑定自己的ip和port,但一般不用写,系统会隐式给绑定。
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <string.h>
#define SERV_IP "127.0.0.1"
#define SERV_PORT 8888
int main()
{
int cfd;
struct sockaddr_in serv_addr;
char buf[BUFSIZ];//BUFSIZ系统自定义的宏
int n;
cfd = socket(AF_INET,SOCK_STREAM,0);
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERV_PORT);//转化成网络字节序
inet_pton(AF_INET,SERV_IP,&serv_addr.sin_addr.s_addr);
//addr.sin_addr.s_addr = htonl(INADDR_ANY);
connect(cfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));
while(1)//不断的监听数据
{
fgets(buf,sizeof(buf),stdin);//不要用gets(已废弃)fgets会给字符串后面加\0" "hello\n\0"
write(cfd,buf,strlen(buf));
n = read(cfd,buf,sizeof(buf));
write(STDOUT_FILENO,buf,n);
}
close(cfd);
}