導航:首頁 > 編程知識 > 怎麼做socket編程

怎麼做socket編程

發布時間:2025-01-09 21:41:04

❶ Socket編程

最近也在學 還有一個自己寫的C++聊天程序 有點大 下面是C寫的
sockets(套接字)編程有三種,流式套接字(SOCK_STREAM),數據報套接字 (SOCK_DGRAM),原始套接字(SOCK_RAW);基於TCP的socket編程是採用的流式套接字(SOCK_STREAM)。基於UDP采 用的數據報套接字(SOCK_DGRAM).
1.TCP流式套接字的編程步驟
在使用之前須鏈接庫函數:工程->設置->Link->輸入ws2_32.lib,OK!
伺服器端程序:
1、載入套接字型檔
2、創建套接字(socket)。
3、將套接字綁定到一個本地地址和埠上(bind)。
4、將套接字設為監聽模式,准備接收客戶請求(listen)。
5、等待客戶請求到來;當請求到來後,接受連接請求,返回一個新的對應於此次連接的套接字(accept)。
6、用返回的套接字和客戶端進行通信(send/recv)。
7、返回,等待另一客戶請求。
8、關閉套接字。
客戶端程序:
1、載入套接字型檔
2、創建套接字(socket)。
3、向伺服器發出連接請求(connect)。
4、和伺服器端進行通信(send/recv)。
5、關閉套接字
伺服器端代碼如下:
#include <Winsock2.h>//加裁頭文件
#include <stdio.h>//載入標准輸入輸出頭文件

void main()
{
WORD wVersionRequested;//版本
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );//1.1版本的套接字

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}//載入套接字型檔,加裁失敗則返回

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}//如果不是1.1的則退出
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//創建套接字(socket)。

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//轉換Unsigned short為網路位元組序的格式
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//將套接字綁定到一個本地地址和埠上(bind)
listen(sockSrv,5);//將套接字設為監聽模式,准備接收客戶請求(listen)。

SOCKADDR_IN addrClient;//定義地址族
int len=sizeof(SOCKADDR);//初始化這個參數,這個參數必須被初始化

while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//accept的第三個參數一定要有初始值。
//等待客戶請求到來;當請求到來後,接受連接請求,返回一個新的對應於此次連接的套接字(accept)。
//此時程序在此發生阻塞
char sendBuf[100];
sprintf(sendBuf,"Welcome %s to http://www.sunxin.org",
inet_ntoa(addrClient.sin_addr));
//用返回的套接字和客戶端進行通信(send/recv)。
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
recv(sockConn,recvBuf,100,0);
printf("%s\n",recvBuf);
closesocket(sockConn);//關閉套接字。等待另一個用戶請求
}
}
客戶端代碼如下:
#include <Winsock2.h>
#include <stdio.h>

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );載入套接字型檔
if ( err != 0 ) {
return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);創建套接字(socket)。

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));向伺服器發出連接請求(connect)。

char recvBuf[100];和伺服器端進行通信(send/recv)。
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
send(sockClient,"This is lisi",strlen("This is lisi")+1,0);

closesocket(sockClient);關閉套接字。
WSACleanup();//必須調用這個函數清除參數
}

❷ 通過Socket實現網路編程的主要過程是什麼

TCP/IP網路通訊開發,一般抄採用Socket開發。它襲分伺服器和客戶端。伺服器端流程:
1、創建伺服器套接字---分配內存、初始化
2、伺服器套接字--偵聽
3、建立與客戶端配套的客戶端套接字
4、與客戶端通訊(可以多客戶端)
5、關閉、銷毀伺服器端相應套接字
----------------
客戶端:
1、創建客戶端套接字---分配內存、初始化
2、連接伺服器
3、與伺服器通訊
4、關閉、銷毀客戶端套接字
----------------

linux C語言編程,socket實現的即使通訊系統

//服務端server.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define SERVPORT 6000 /*伺服器監聽埠號 */
#define BACKLOG 10 /* 最大同時連接請求數 */
#define MAXDATASIZE 100

main()
{
char buf[MAXDATASIZE];
int sockfd,client_fd; /*sock_fd:監聽socket;client_fd:數據傳輸socket */
struct sockaddr_in my_addr; /* 本機地址信息 */
struct sockaddr_in remote_addr; /* 客戶端地址信息 */

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket創建出錯!");
exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
{
perror("bind出錯!");
exit(1);
}
if (listen(sockfd, BACKLOG) == -1)
{
perror("listen出錯!");
exit(1);
}
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)) == -1)
{
perror("accept出錯");
continue;
}
printf("received a connection from %s\n", inet_ntoa(remote_addr.sin_addr));
if (!fork())
{ /* 子進程代碼段 */
if ((recvbytes=recv(client_fd, buf, MAXDATASIZE, 0)) ==-1)
{
perror("recv出錯!");
close(client_fd);
exit(0);
}
buf[recvbytes] = '\0';
printf("from client Received: %s",buf);

if (send(client_fd, "thanks!\n", 8, 0) == -1)
perror("send出錯!");
close(client_fd);
exit(0);
}
close(client_fd);
}
}

//客戶端client.c
#include<stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define SERVPORT 6000
#define MAXDATASIZE 100

main(int argc, char *argv[])
{
int sockfd, recvbytes;
char buf[MAXDATASIZE];
struct hostent *host;
struct sockaddr_in serv_addr;
if (argc < 2)
{
fprintf(stderr,"Please enter the server's hostname!\n");
exit(1);
}
if((host=gethostbyname(argv[1]))==NULL)
{
herror("gethostbyname出錯!");
exit(1);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket創建出錯!");
exit(1);
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERVPORT);
serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(serv_addr.sin_zero),8);
if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1)
{
perror("connect出錯!");
exit(1);
}

if (send(sockfd, "hello!\n", 7, 0) == -1)
{
perror("send出錯!");
exit(1);
}

if ((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) ==-1)
{
perror("recv出錯!");
exit(1);
}
buf[recvbytes] = '\0';
printf("Received: %s",buf);
close(sockfd);
}

❹ 有誰能給我思路嗎 關於簡單的socket編程。

首先,你得寫個伺服器;用兩個客戶端連接上伺服器,客戶端通過伺服器進行數據交流。

基於TCP(面向連接)的Socket編程
伺服器端順序:
1. 載入套接字型檔
2. 創建套接字(socket)
3. 將套接字綁定到一個本地地址和埠上(bind)
4. 將套接字設為監聽模式,准備接收客戶請求(listen)
5. 等待客戶請求的到來;當請求帶來後,接受連接請求,返回一個新的對應於此次連接的套接字(accept)
6. 用返回的套接字和客戶端進行通信(send/recv)
7. 返回,等待另一個客戶請求
8. 關閉套接字(closesocket)
客戶端程序:
1. 載入套接字型檔
2. 創建套接字(socket)
3. 向伺服器發送連接請求(connect)
4. 和伺服器端進行通信(send/receive)
5. 關閉套接字(closesocket)

基於UDP(面向無連接)的socket編程
伺服器端(接收端)程序:
1. 載入套接字型檔
2. 創建套接字(socket)
3. 將套接字綁定到一個本地地址和埠上(bind)
4. 等待接收數據(recvfrom)
5. 關閉套接字(closesocket)
客戶端(發送端)程序
1. 載入套接字型檔
2. 創建套接字(socket)
3. 向伺服器發送數據(sendto)
4. 關閉套接字(closesocket)

❺ socket介面網路編程

面向無連接的端對端通信
//#include <winsock2.h>
//#pragma comment(lib,"WS2_32.lib")
WSADATA wsd;
SOCKET s;
char buf[1024];
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
return -1;//失敗
}
s=socket(AF_INET,SOCK_DGRAM,0);
if(s==INVALID_SOCKET)
{
WSACleanup();
return -1;//創建套接字失敗
}
SOCKADDR_IN servAddr;
servAddr.sin_family=AF_INET;
servAddr.sin_addr.s_addr=inet_addr(%%1);
servAddr.sin_port=htons(INADDR_ANY);
if(bind(s,(SOCKADDR*)&servAddr,sizeof(SOCKADDR_IN))==SOCKET_ERROR)
{
closesocket(s);
WSACleanup();
return -1;//綁定套接字失敗
}
int nServAddrlen=sizeof(servAddr);
ZeroMemory(buf,sizeof(buf));
if(recvfrom(s,buf,size(buf),0,(SOCKADDR*)&servAddr,nServAddrlen)==SOCKET_ERROR)
{
closesocket(s);
WSACleanup();
return -1;//接收數據失敗
}
CString %%2(buf);
ZeroMemory(buf,sizeof(buf));
strcpy(buf,%%3);
SOCKADDR_IN clientAddr;
clientAddr.sin_family=AF_INET;
clientAddr.sin_addr.s_addr=inet_addr(%%4);
clientAddr.sin_port=htons((short)%%5);
int nClientlen=size(clientAddr);
if(sendto(s,buf,sizeof(buf),0,(SOCKADDR*)&clientAddr,nClientlen)==SOCKET_ERROR)
{
closesocket(s);
WSACleanup();
return -1;//向伺服器發送數據失敗
}
closesocket(s);
WSACleanup();

閱讀全文

與怎麼做socket編程相關的資料

熱點內容
什麼編程可以控制瀏覽器 瀏覽:277
微信文愛聊天截圖圖片 瀏覽:427
糖果小號密碼查看工具 瀏覽:191
pm一般做什麼編程 瀏覽:937
linux共享文件給mac 瀏覽:428
ps另存為時找不到文件 瀏覽:818
iphone6s朋友圈視頻沒聲音 瀏覽:728
win10系統工具文件夾 瀏覽:862
微信扔出去的怎樣找回來 瀏覽:744
編程怎麼錄視頻 瀏覽:470
東方財富app解套率怎麼計算 瀏覽:74
win10系統為excel文件在哪裡 瀏覽:578
字幕文件哪個網站下載 瀏覽:745
app怎麼推廣推廣 瀏覽:674
小鳥壁紙哪個文件夾刪不掉 瀏覽:419
閨蜜圈app怎麼樣 瀏覽:931
新版天貓app如何查看詳情 瀏覽:390
sql資料庫同步 瀏覽:492
網路面板線錯了怎麼辦 瀏覽:343
cs6畫筆工具在哪 瀏覽:290

友情鏈接