socket获取客户端ip例子
来源:互联网 发布:空间绑定域名教程 编辑:程序博客网 时间:2024/05/21 11:02
https://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html
作者:吴秦
出处:http://www.cnblogs.com/skynet/
本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接).
例子源码来源于上面帖子。稍做修改,将客户端地址获取,并转换成字符串打印,找了一圈。没有找到靠谱例子~~
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define MAXLINE 4096
int main(int argc, char** argv)
{
int listenfd, connfd;
struct sockaddr_in servaddr,caddr;
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);
exit(0);
}
memset(&servaddr, 0, sizeof(servaddr));
memset(&caddr,0,sizeof(caddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
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){
socklen_t length = sizeof(caddr);
if( (connfd = accept(listenfd, (struct sockaddr*)&caddr,&length)) == -1){
printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
continue;
}
n = recv(connfd, buff, MAXLINE, 0);
buff[n] = '\0';
printf("recv msg from client: %s\n",buff);
printf("recv msg from %s:client: %s\n", inet_ntoa(caddr.sin_addr),buff);
close(connfd);
}
close(listenfd);
}
客户端:原文未动
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define MAXLINE 4096
int main(int argc, char** argv)
{
int sockfd, n;
char recvline[4096], sendline[4096];
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){
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);
exit(0);
}
======================================================================================
各个函数介绍:
socket,原型:
int socket(int domain, int type, int protocol);选择协议域(ipv4 ipv6),socket类型(流 其他),协议(tcp udp)
通过该操作 得到一个文件描述符
将文件描述符和监听端口绑定
bing(int sockfd,conststruct sockaddr *addr, socklen_t addrlen)
我们是是网络socket,所以要强转一下 ,两者区别:
struct sockaddr是通用的套接字地址,而struct sockaddr_in则是internet环境下套接字的地址形式
调用例子:
bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr))
绑定之后,便是listen,accept
int listen(int sockfd, int backlog);
然后就可以愉快通讯了。注意有个网络字节序和主机字节序int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);listen定义监听的最大连接数
accept将服务器socket与客户端的网络信息结合在一起,返回后续通讯达客户端句柄
客户端,先调用socket,获取文件句柄,然后将服务器参数和句柄绑定int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
网络是大端~~
- socket获取客户端ip例子
- 【socket】获取客户端IP
- Socket获取客户端IP地址及端口号
- socket编程之---------获取客户端主机名和IP地址
- Socket获取客户端IP地址及端口号
- linux 使用c在tcp socket服务器端获取客户端ip
- socket编程服务器客户端例子
- 超简单socket客户端例子
- C# Udp Socket例子 客户端
- 获取客户端IP地址
- 获取客户端ip
- 获取客户端ip
- 获取客户端IP
- 获取客户端IP
- 获取客户端ip地址
- 获取客户端IP
- 获取客户端IP地址
- java获取客户端ip
- ConcurrentHashMap总结
- 算法16 Word Search
- SQL Server 2008允许远程访问配置
- 创建glance镜像报错HTTP503
- Ceph学习——Librados与Osdc实现源码解析
- socket获取客户端ip例子
- Spring Cloud Feign fallback错误解决
- spark数据倾斜处理
- Design T-Shirt问题:c++
- DataTables在IE8下报'style' 为空或不是对象错误问题
- scrapy多爬虫以及爬取速度
- springboot(二)添加logback日志
- 关于技术与管理的思考
- div——css渐变线背景