#include<sys/socket.h>
#include<netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
pthread_t thread[2];
int fd;
//客户端发出的消息
void *thread1()
{
char buf[1024];
memset(buf, 0, sizeof(buf));
do{
memset(buf, 0, sizeof(buf));
printf("请输入内容:");
scanf("%s",buf);
send(fd, buf, sizeof(buf), 0);
NSLog(@"从客户端发出的消息%s",buf);
}while (strcmp(buf, "exit\n")!=0);
close(fd);
return 0;
}
//服务器接收的消息
void*thread2()
{
char buf[1024];
ssize_t receSize;//接收发送消息的长度
do{
memset(buf, 0, sizeof(buf));//清理
receSize=recv(fd, buf, sizeof(buf), 0);
if (receSize<0)
{
NSLog(@"服务端断开连接");
break;
}
NSLog(@"从客户端收到的消息:%s\n",buf);
}while (strcmp(buf, "exit\n")!=0);
//关闭客户端:只是关闭这个套接字特定的tcp连接
close(fd);
return 0;
}
int main(int argc, const char * argv[]) {
//客户端顺序: socket->bing->connect->sd=send/recv->close
//domain
//type 模式 有流模式或者其他
//协议
fd=socket(AF_INET, SOCK_STREAM, 0);
BOOL succes=(fd!=-1);//套接字不等于-1创建成功
int err;
struct sockaddr_in clientAddr;//客户端地址结构体
if (succes) {
NSLog(@"socket成功");
memset(&clientAddr, 0, sizeof(clientAddr));
clientAddr.sin_len=sizeof(clientAddr);
clientAddr.sin_family=AF_INET;
clientAddr.sin_addr.s_addr=INADDR_ANY;//想象成任意一个地址
err=bind(fd, (const struct sockaddr*)&clientAddr, sizeof(clientAddr));
succes=(err==0);
}
if (succes)
{
NSLog(@"bing成功");
}
//创建服务器地址信息
struct sockaddr_in serverAddr;
memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_len=sizeof(serverAddr);
serverAddr.sin_family=AF_INET;
serverAddr.sin_port=htons(1024);
serverAddr.sin_addr.s_addr=inet_addr("192.168.4.135");//这个地址是本地一般测试用
//客户端向服务端发送链接请求,成功返回0;
connect(fd, (struct sockaddr*)&serverAddr,sizeof(serverAddr));
succes=(err==0);
if(succes)
{
NSLog(@"concect成功");
//客户端地址长度
socklen_t addrlen=sizeof(clientAddr);
//getsockname可以正确获得当前正在通信的socker的ip、端口信息
err=getsockname(fd, (struct sockaddr*)&clientAddr, &addrlen);
succes =(err==0);
if (succes)
{
NSLog(@"本地地址:%s,端口号:%d",inet_ntoa(clientAddr.sin_addr),ntohs(clientAddr.sin_port));
//创建线程(1.线程2.属性3.线程函数)
pthread_create(&thread[0], NULL, thread1, NULL);
//创建线程2
pthread_create(&thread[1], NULL, thread2, NULL);
//以阻塞的方式等待线程指定的函数结束。当函数返回时,资源回收。
pthread_join(thread[0], NULL);
pthread_join(thread[1], NULL);
}
}
return 0;
}