當前位置:首頁 » 網路連接 » 計算機網路socket通信實驗報告

計算機網路socket通信實驗報告

發布時間: 2022-07-18 03:51:06

① TCP/IP 使用Socket 實現客戶端與伺服器端通信

之所以稱為TCP伺服器,是因為伺服器端執行TCP的listen(監聽連入請求)邏輯;而TCP客戶端執行的是connect(請求連接)邏輯。
所以,不能可能讓伺服器去主動連接客戶端端的。

② 1、基於套接字Socket通信的編程: 建立TCPSocket進行通信,伺服器端向客戶端傳送日期數據,客戶端收到信息

//獲取時間
CString strTime;
CTime st = CTime::GetCurrentTime();
strTime = st.Format("%Y%m%d%H%M%S");
//創建伺服器端
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 sock = socket(AF_INET,SOCK_STREAM,0);
int opt = 1;
int len11 = sizeof(opt);

setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char*)&opt,len11);
if (sock == INVALID_SOCKET)
{
// "初始化失敗" ;
closesocket(sock);

return;
}
SOCKADDR_IN addrsrv;
addrsrv.sin_family = AF_INET;
addrsrv.sin_port = htons(6001);
addrsrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
if (bind(sock,(SOCKADDR*)&addrsrv,sizeof(SOCKADDR)) == SOCKET_ERROR)
{
// "綁定失敗"
closesocket(sock);
return;
}
listen(sock,10);
//客戶端接收伺服器連接
char m_recvBuf[2000];
memset(m_recvBuf, 0, 2000);
while(TRUE)
{
SOCKET sNew = ::accept(sock, (SOCKADDR*)&addrRemote, &nAddrLen);//接收到客戶端連接
//發送時間
int hvsndlen = 0;
int sndlen = 0;
while ((len -hvsndlen) > 0)
{
sndlen = send(soc,(LPCTSTR)strTime +hvsndlen,len-hvsndlen,0);
if (sndlen == SOCKET_ERROR)
{
return -1;
}
hvsndlen += sndlen;
}
}
//把以上程序放入你的主程序中,應該可以運行。裡面有CString類型,如果用不習慣,你可以把CTime 轉換成其他類型

計算機網路socket linux下用c或c++寫

/*伺服器*/
#include <arpa/inet.h>
#include <errno.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/io.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/times.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>
#define szSTR 256
#define SERVERPORT 21429 /*please modify the port with your id*/

int do_listen(const int port, const int bTcp)
{
int s = 0, r = 0, o = 1;
struct sockaddr_in h;
memset(&h, 0, sizeof(h));
h.sin_family = AF_INET; h.sin_port = htons(port);
h.sin_addr.s_addr = INADDR_ANY;
s = socket(AF_INET, bTcp?SOCK_STREAM:SOCK_DGRAM, 0);
if (s < 1) { perror("socket(listen)"); return 0;}
r = setsockopt(s, SOL_SOCKET,SO_REUSEADDR, (char *)&o, sizeof(int));
if (r == -1) { perror("setsockopt(listen)"); return 0;}
r = bind(s, (struct sockaddr *)&h, sizeof(h));
if (r == -1) { perror("bind(listen)"); return 0;}
if (bTcp) {
r = listen(s, SOMAXCONN);
if (r == -1) { perror("listen()"); return 0;}
}/*end if*/
/*signal(SIGPIPE, SIG_IGN);*/
return s;
}/*end do_listen*/

void response(int sck, struct sockaddr_in * host)
{
FILE * f = 0; char cmd[szSTR]; time_t now;
struct tm * t = 0;
f = fdopen(sck, "w+");
while(!feof(f)) {
memset(cmd, 0, szSTR);
fgets(cmd, szSTR -1, f);
time(&now);
t = localtime(&now);
if(strstr(cmd, "DATE")) {
fprintf(stderr, "Query Type: Date\n");
fprintf(f, "Date: %d %d, %d\n", t->tm_mon + 1, t->tm_mday, t->tm_year + 1900);
continue;
}/*end if*/
if(strstr(cmd, "TIME")) {
fprintf(stderr, "Query Type: Time\n");
fprintf(f, "Time: %02d::%02d::%02d\n", t->tm_hour, t->tm_min, t->tm_sec);
continue;
}/*end if*/
if(strstr(cmd, "EXIT")) break;
fprintf(f, "commands: DATE, TIME, EXIT.\n");
}/*end while*/
shutdown(sck, SHUT_RDWR);
close(sck);
fclose(f);
return ;
}/*end response*/

int main(void)
{
socklen_t sklen = 0;int sck = 0, i = 0, listener = 0;
struct sockaddr_in client; pid_t proc = 0;
system("ifconfig");
listener = do_listen(SERVERPORT, 1);
if(listener < 1) { perror("listen()"); return 0; }
for(i=0;i<2;i++) {
memset(&client, 0, sizeof(client));
sklen = sizeof(client);
sck = accept(listener, (struct sockaddr *)&client, &sklen);
if(sck < 1) break;
proc = fork();
if (proc == -1) { perror("fork()"); break ; }
if(proc) continue;
response(sck, &client);
break;
}/*next*/
close(listener);
return 0;
}/*end main*/

/*客戶機*/
#include <arpa/inet.h>
#include <errno.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/io.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/times.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>
#define szSTR 256
#define SERVERPORT 21429 /*please modify the port with your id*/
int cnn(const char * ip, const int port)
{
struct sockaddr_in h; memset(&h, 0, sizeof(h));
h.sin_family = AF_INET; h.sin_port = htons(port);
h.sin_addr.s_addr = inet_addr(ip);
int s = socket(AF_INET, SOCK_STREAM, 0);
if (s < 1) { perror("socket(tcp)"); return 0;}
int r = connect(s, (struct sockaddr *)&h, sizeof(h));
if (r == 0) return s;
perror("connect()");
return 0;
}//end cnn

int main(void)
{
int sck = 0; FILE * f = 0; char ip[szSTR]="127.0.0.1";
fprintf(stderr, "Please input the calendar server ip:");
fgets(ip, szSTR - 1, stdin);
sck = cnn(ip, SERVERPORT);
if(sck < 1) return 0;
f = fdopen(sck, "w+");
fprintf(f, "DATE\r\n");
fgets(ip, szSTR -1 , f);
fprintf(stderr, "%s\n", ip);
fprintf(f, "TIME\r\n");
fgets(ip, szSTR -1 , f);
fprintf(stderr, "%s\n", ip);
fprintf(f, "EXIT\r\n");
fclose(f);
close(sck);
return 0;
}/*end main*/

如何使用socket進行客戶端和伺服器端的通信

下載完成後,軟體是一個單獨的運行程序,可以直接打開軟體。

3
軟體的界面很簡單,在左側有tcp和udp的客戶端或服務端的快捷按鈕,上方有【創建】【刪除】【退出】等選項按鈕。

4
我們先來建立TCP的測試服務端。點擊【TCP Server】再點擊【創建】。

選擇一個監聽埠,這里我們使用6001作為服務端的監聽埠。

建立完成後,服務端會自動啟動,軟體會顯示【啟動監聽】的狀態。

我們可以檢測一下本機的6001埠是否已經打開。在DOS窗口中輸入命令【netstat -a】,可以在列表中看到本機的6001埠的狀態為listening的狀態,表示本機的6001埠正處於監聽的狀態。

在DOS窗口中輸入命令【telnet 192.168.0.140 6001】來登錄本地的6001埠。

點擊回車鍵,就可以成功登錄6001埠。在測試軟體中就可以看到狀態是已連接的狀態,同時也可以看到對方的ip就是本地ip。

再來測試通信情況,在DOS窗口中輸入a、b、c,在軟體的接收窗口就可以看到收到的數據了。

在軟體的發送窗口中輸入1234567890,點擊發送後,在DOS窗口中就可以看到軟體發送過來的數據了。

測試完成後,在軟體中點擊【停止監聽】,同時在DOS窗口中可以看到【失去了跟主機的連接】,表示測試連接已經斷開。

再來創建TCP的客戶端,點擊【TCP Client】再點擊【創建】。會彈出【創建socket客戶端】窗口,輸入對方的ip和對方的埠,點擊確認。

tcp的客戶端已經建立好,如果對方的埠監聽正常的話,點擊【連接】就可以連接到對方的埠和對方進行測試通信了。

⑤ 跪求:使用socket進行通信程序設計,編寫一個網路通信應用程序,包括伺服器端和客服端兩個程序。

網路知道里有很多:
http://..com/q?word=socket%CD%A8%D0%C5%CA%B5%CF%D6C%2FS%B3%CC%D0%F2%B5%C4%BB%F9%B1%BE%B7%BD%B7%A8&ct=17&pn=0&tn=ikaslist&rn=10&fr=qrl&cid=93&fr2=query